【算法训练】LeetCode#1512 好数对的数目
一、描述
1512. 好数对的数目
给你一个整数数组 nums
。
如果一组数字 (i,j)
满足 nums[i]
== nums[j]
且 i
< j
,就可以认为这是一组 好数对 。
返回好数对的数目。
示例 1:
输入:nums = [1,2,3,1,1,3]
输出:4
解释:有 4 组好数对,分别是 (0,3), (0,4), (3,4), (2,5) ,下标从 0 开始
示例 2:
输入:nums = [1,1,1,1]
输出:6
解释:数组中的每组数字都是好数对
示例 3:
输入:nums = [1,2,3]
输出:0
二、思路
首先想到的肯定是时间复杂度为logn的做法,从头向后遍历。
其实可以利用map,通过一次遍历即可。
三、解题
Java
class Solution {
public static int numIdenticalPairs(int[] nums) {
HashMap<Integer, List<Integer>> map = new HashMap<>();
for (int num : nums) {
List<Integer> cur = Arrays.asList(0, 0);
if (map.containsKey(num)){
// 存在
cur = map.get(num);
cur.set(0, cur.get(0) + 1);
cur.set(1, cur.get(1) + cur.get(0));
}
map.put(num,cur);
}
int ans = 0;
for (Map.Entry<Integer, List<Integer>> entity : map.entrySet()){
ans += entity.getValue().get(1);
}
return ans;
}
}
C++
class Solution {
public:
int numIdenticalPairs(vector<int>& nums) {
int ans = 0;
unordered_map <int, int> map;
for (int var : nums) {
++map[var];
}
for (auto kv :map){
ans += kv.second * (kv.second - 1) / 2;
}
return ans;
}
};