力扣(LeetCode)-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

来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/number-of-good-pairs
题解:

首先想到的是双循环暴力计数就行,时间复杂度为O(n^2)

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]){
                    count++;
                }
            }
        }
        return count;
    }
}

官方给出了另外一种解法,先找到元素相同的个数(记为v),同时要保证i

力扣(LeetCode)-1512. 好数对的数目_第1张图片

class Solution {
    public int numIdenticalPairs(int[] nums) {
        int count = 0;
        // 存储元素出现的次数
        Map m = new HashMap();
        for(int i = 0;i < nums.length;i++){
            m.put(nums[i],m.getOrDefault(nums[i], 0) + 1);
        }
        for (Map.Entry entry : m.entrySet()) {
            int v = entry.getValue();
            count += v * (v - 1) / 2;
        }
        return count;
    }
}

 看了别人的代码看到了一种有意思的解法,只有一句666。不用再次遍历map,如果这个数第一次出现,这个数的好对数为0,value更改为1,下一次这个数出现时,这个数的好对数就位0+1,value更改为2,一次类推,不同的数的好对数都会被计算。

class Solution {
    public int numIdenticalPairs(int[] nums) {
        int count=0;
        Map map=new HashMap<>();
        for(int num:nums){
            int value=map.getOrDefault(num,0);
            count+=value;
            map.put(num,valve+1);
        }
        return count;
    }
}

 另一种解法,不使用map:利用数组统计元素出现个数的统计过程,计算好对数的个数

class Solution {
    public int numIdenticalPairs(int[] nums) {
        int count=0;
        //因为 1<= nums[i] <= 100  所以申请大小为100的数组
        //temp用来记录num的个数
        int[] temp = new int[100];
        /*
        从前面开始遍历nums
        假设nums = [1,1,1,1]
        第一遍
        temp是[0,0,0,0]
        count+=0;
        temp[0]++;
        第二遍
        temp是[1,0,0,0]
        count+=1;
        temp[0]++;
        第三遍
        temp=[2,0,0,0]
        count+=2;
        temp[0]++;
        第四遍
        temp=[3,0,0,0]
        count+=3;
        temp[0]++;
        */
        for (int num : nums) {
            /*
            这行代码可以写成
            count+=temp[num - 1];
            temp[num - 1]++;
            */
            count += temp[num - 1]++;
        }
        return count;
    }
}

力扣(LeetCode)-1512. 好数对的数目_第2张图片

 

你可能感兴趣的:(力扣,LeetCode,1512.,好数对的数目,Java,算法)