给你一个整数数组 nums 。
如果一组数字 (i,j) 满足 nums[i] == nums[j] 且 i < j ,就可以认为这是一组 好数对 。
返回好数对的数目。
示例:
输入:nums = [1,2,3,1,1,3]
输出:4
解释:有 4 组好数对,分别是 (0,3), (0,4), (3,4), (2,5) ,下标从 0 开始
方法一:HashMap不遍历
public int numIdenticalPairs(int[] nums) {
HashMap<Integer, Integer> map = new HashMap<>();
int count = 0;
int value = 0;
for (int i : nums) {
value = map.getOrDefault(i, 0);
count += value;
map.put(i, value + 1);
}
return count;
}
方法二:组合计数
用哈希表统计每个数在序列中出现的次数,假设数字 k在序列中出现的次数为 v,那么满足题目中所说的 nums[i]==nums[j]==k (且i < j) 的 (i,j) 的数量就是 v(v−1)/2
class Solution {
public int numIdenticalPairs(int[] nums) {
Map<Integer, Integer> m = new HashMap<Integer, Integer>();
for (int num : nums) {
m.put(num, m.getOrDefault(num, 0) + 1);
}
int ans = 0;
for (Map.Entry<Integer, Integer> entry : m.entrySet()) {
int v = entry.getValue();
ans += v * (v - 1) / 2;
}
return ans;
}
}
反思
学习别人的思想,这些是我想不出来的,也不容易吸收理解的。
end.