解法1:暴力枚举
class Solution {public int numIdenticalPairs(int[] nums) {int count = 0;for(int i = 0;i < nums.length; i++){for(int j = i + 1; j < nums.length; j++){if(nums[i] == nums[j])count++;}}return count;}
}
没啥可说的,就是小学数学问题…
解法2:类比:求解重复数字的个数
这道题的本质,其实就是求解重复数字的个数,只不过,统计的是对儿数,统计规则不一样而已!,也就是
- 数字有1个,0对儿
- 数字有2个,1对儿
- 数字有3个,1+2 = 3对儿
- 数字有4个,1+2+3 = 6对儿
- ……
小学数学,想起来没?
写法1:利用题目限制条件
我们直接开一个长度100的数组就行了。
class Solution {public int numIdenticalPairs(int[] nums) {int sum = 0;int[] arr = new int[100];for(int v: nums){sum += arr[v-1];arr[v-1]++;}return sum;}
}
这样一来,我们为全部可能出现的数字都分配了一个位置,也就是数组下标,如果数字出现,就记录一次,然后总的记录也按照统计规则进行。
写法2:利用哈希表
对于上述写法,确实容易,但是浪费空间,而且如果题目没有这个限制呢?其实我们可以看到记录某个数字重复次数,其实可以用哈希表记录呀!
How to use HashMap in Java?
class Solution {public int numIdenticalPairs(int[] nums) {// Using HashMapHashMap<Integer,Integer> hashMap = new HashMap<>();Integer sum = 0;for(int value: nums){sum += hashMap.getOrDefault(value,0);hashMap.put(value,hashMap.getOrDefault(value,0) + 1);}return sum;}
}
getOrDefault方法,就是
- 如果有这个关键字,就返回关键字对应的值
- 如果没有,就返回设置的默认值
哈希表的本质,其实就是值查找。
小结
对于这个好数对儿题目,本质是另外一道题,也就是统计一个数组中,有哪些重复的数字,且记录他们出现的次数。
至于好数对儿,只是按照n(n-1)/2
的方式记录而已,小学数学不多说。