首页 > 技术文章 > [LeetCode] 1512. Number of Good Pairs

cnoodle 2020-07-13 04:33 原文

Given an array of integers nums.

A pair (i,j) is called good if nums[i] == nums[j] and i < j.

Return the number of good pairs.

Example 1:

Input: nums = [1,2,3,1,1,3]
Output: 4
Explanation: There are 4 good pairs (0,3), (0,4), (3,4), (2,5) 0-indexed.

Example 2:

Input: nums = [1,1,1,1]
Output: 6
Explanation: Each pair in the array are good.

Example 3:

Input: nums = [1,2,3]
Output: 0

Constraints:

  • 1 <= nums.length <= 100
  • 1 <= nums[i] <= 100

题意是给一个数组,求的是数组中坐标不同但是值相同的pair有多少对。

暴力解很好想,就是类似于two sum一样的两层for循环。由于数据量不是很大,这个思路是不超时的。

时间O(n^2)

空间O(1)

Java实现

 1 class Solution {
 2     public int numIdenticalPairs(int[] nums) {
 3         // corner case
 4         if (nums == null || nums.length == 0) {
 5             return 0;
 6         }
 7         
 8         // normal case
 9         int res = 0;
10         for (int i = 0; i < nums.length - 1; i++) {
11             for (int j = i + 1; j < nums.length; j++) {
12                 if (nums[i] == nums[j]) {
13                     res++;
14                 }
15             }
16         }
17         return res;
18     }
19 }

 

JavaScript实现

 1 /**
 2  * @param {number[]} nums
 3  * @return {number}
 4  */
 5 var numIdenticalPairs = function(nums) {
 6     let res = 0;
 7     for (let i = 0; i < nums.length - 1; i++) {
 8         for (let j = i + 1; j < nums.length; j++) {
 9             if (nums[i] == nums[j]) {
10                 res++;
11             }
12         }
13     }
14     return res;
15 };

 

优化一些的思路是用hashmap。一开始扫描数组的时候遇到的数字一定没有在hashmap出现过,所以就正常存储;之后遇到的数字很有可能在hashmap中出现过,所以判断如果存在过,就往res上累加map.get(nums[i]) - 1。

时间O(n)

空间O(n)

Java实现

 1 class Solution {
 2     public int numIdenticalPairs(int[] nums) {
 3         int res = 0;
 4         Map<Integer, Integer> map = new HashMap<>();
 5         for (int num : nums) {
 6             map.put(num, map.getOrDefault(num, 0) + 1);
 7             res += map.get(num) - 1;
 8         }
 9         return res;
10     }
11 }

 

JavaScript实现

 1 /**
 2  * @param {number[]} nums
 3  * @return {number}
 4  */
 5 var numIdenticalPairs = function(nums) {
 6     let res = 0;
 7     let map = new Map();
 8     for (let num of nums) {
 9         if (!map.has(num)) {
10             map.set(num, 1);
11         } else {
12             map.set(num, map.get(num) + 1);
13             res += map.get(num) - 1;
14         }
15     }
16     return res;
17 };

 

LeetCode 题目总结

推荐阅读