- 嵌套for循环
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] && i < j) {
count++;
}
}
}
return count;
}
}
- 根据提示找规律(看完答案逆推的结果)
输入:nums = [1,2,3,1,1,3]
输出:4
解释:有 4 组好数对,分别是 (0,3), (0,4), (3,4), (2,5) ,下标从 0 开始
输入:nums = [1,1,1,1]
输出:6
解释:数组中的每组数字都是好数对
输入:nums = [1,2,3]
输出:0
原题解释:如果一组数字 (i,j) 满足 nums[i] == nums[j] 且 i < j ,就可以认为这是一组 好数对
可以理解为从左到右找对应的相同的数据的下标,下标小的在前,比如 nums = [1,2,3,1,1,3]
先找1:有下标0、3、4,两两组合,有(0,3), (0,4), (3,4) 共3个
再找2:数组中就一个2,共0个
最后找3:有下标2、5,两两组合,有(2,5) 共1个
[1,1,1,1]、[1,2,3] 同理
可以得到结果为每个数据在数组中的个数组成的数对和,然后找每个数在数组中个数的规律
[1,1,1,1,1]
个数为1 结果为0
个数为2 结果为1 0+1
个数为3 结果为3 1+2
个数为4 结果为6 3+3
个数为5 结果为10 6+4
......
个数为n+1 结果为f(n)+ n n>=0
代码为
class Solution {
public int numIdenticalPairs(int[] nums) {
int[] test = new int[100];//红框中
int result = 0;
for(int num:nums){
result += test[num-1];//结果加上该数出现的个数,出现1次加0
test[num-1]++;//记录当前出现的次数
}
return result;
}
}