给你一个整数数组 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 开始
提示:
1 <= nums.length <= 100
1 <= nums[i] <= 100
来源:力扣(LeetCode)
题解
首先想到的方法两重for循环直接遍历,如果两数相等则count++
class Solution {
public:
int numIdenticalPairs(vector<int>& nums) {
int count = 0;
for(int i=0;i<nums.size()-1;i++)
{
for(int j=i+1;j<nums.size();j++)
{
if(nums.at(i)==nums.at(j))
count++;
}
}
return count;
}
};
但是这样效率一定是比较低的 因为如果有三个数字相同,位置分别为1,3,5,那么第一遍遍历发现了这三个数相同则count加2,但是当从遍历到三位置开始时又会重新判断是否跟5相同然后count+1,然而实际上这是应该由第一遍遍历就得到的信息,由此产生了第二种方法,统计每个数字出现的个数,再通过组合数进行计算好数对数目。
class Solution {
public:
int numIdenticalPairs(vector<int>& nums) {
int hash[101]={0};
int count=0;
for(int i=0; i<nums.size(); i++)
{
hash[nums.at(i)]++; //统计每个数出现的次数
}
for(int i=1; i<101; i++)
{
if(hash[i]>=2)
{
count = count+hash[i]*(hash[i]-1)/2; //通过组合数计算好数对个数
}
}
return count;
}
};