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
提示:
1 <= nums.length <= 100
1 <= nums[i] <= 100
法一:暴力
class Solution { public: int numIdenticalPairs(vector<int>& nums) { int len = nums.size(), ans = 0; for(int i=0; i<len; i++){ for(int j=i+1; j<len; j++){ if(nums[i] == nums[j]){ ans ++; } } } return ans; } };
时间:O(n^2)
空间:O(n)
法二:数学问题
假设数字k在序列中出现的次数是v,那么满足nums[i] == nums[j] = k(i<j)的(i,j)的数量是v(v-1)/2,即k这个数值对答案的贡献是v(v-1)/2,只需把所有数值的贡献都相加即可。
例如,对于1,1,1,1.
好数对一共有3+2+1 = 4*(4-1)/2 = 6
class Solution { public: int numIdenticalPairs(vector<int>& nums) { int len = nums.size(), ans = 0; unordered_map<int, int>umap; for(auto &i:nums){ umap[i]++; } for(auto &[k, v]:umap){ ans += v*(v-1)/2; } return ans; } };
时间:O(n)
空间:O(n)