LeetCode 1512 好数对的数目

156 阅读1分钟

image.png

原题链接

  1. 嵌套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;
        }
    }
  1. 根据提示找规律(看完答案逆推的结果)
输入: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;
    }
}