其他分享
首页 > 其他分享> > 力扣解题思路:532. 数组中的 k-diff 数对 纠错记录

力扣解题思路:532. 数组中的 k-diff 数对 纠错记录

作者:互联网

532. 数组中的 k-diff 数对

思路:在这里插入图片描述
首先看我第一版本的错误代码(这里的map可以直接改成set,因为本身也没用到value):

public int findPairs(int[] nums, int k) {
    Map<Integer,Integer> map = new HashMap<>();
    int sum = 0;
    for(int i=0;i<nums.length;i++){
        int a = map.containsKey(nums[i]-k)? 1:0;
        int b = map.containsKey(nums[i]+k)? 1:0;
        sum += (a+b);
        map.put(nums[i],map.getOrDefault(nums[i],0)+1);
    }
    return sum;
}

看似没有问题,实际上当所给数组有重复数字则会计算重复,例如【3,1,4,1,5】2,则会有3,1被重复计算两次。于是我又一想,用set去重不就好了嘛:

public int findPairs(int[] nums, int k) {
    Map<Integer,Integer> map = new HashMap<>();
    Set<int[]> set = new HashSet<>();
    int sum = 0;
    for(int i=0;i<nums.length;i++){
        if(map.containsKey(nums[i]-k)){
            System.out.println("1"+"--"+(nums[i]-k)+"--"+nums[i]);
            set.add(new int[]{nums[i]-k,nums[i]});
        }
        if(map.containsKey(nums[i]+k)){
            System.out.println("2"+"--"+(nums[i]+k)+"--"+nums[i]);
            set.add(new int[]{nums[i]+k,nums[i]});
        }
        map.put(nums[i],map.getOrDefault(nums[i],0)+1);
        System.out.println("3"+"--"+nums[i]+"--"+map.get(nums[i]));
    }
    return set.size();
}

然后仍然错!!我明明去重了呀,然后我把各行print出来,发现这里的set完全没有去重的作用,我恍然大悟,因为set里的元素是数组!所以比较的是地址,自然即使两个数组一样,比较的结果也会不一样!!!所以不能用int[]集合去重。。。

那不行,我必须用set去重!!于是我想了另一个办法,那我就保存数组对的和就行了,和相等不九是重复嘛:

public int findPairs(int[] nums, int k) {
    Map<Integer,Integer> map = new HashMap<>();
    Set<Integer> set = new HashSet<>();
    int sum = 0;
    for(int i=0;i<nums.length;i++){
        if(map.containsKey(nums[i]-k)){
            //System.out.println("1"+"--"+(nums[i]-k)+"--"+nums[i]);
            set.add(nums[i]-k+nums[i]);
        }
        if(map.containsKey(nums[i]+k)){
            //System.out.println("2"+"--"+(nums[i]+k)+"--"+nums[i]);
            set.add(nums[i]+k+nums[i]);
        }
        map.put(nums[i],map.getOrDefault(nums[i],0)+1);
        //System.out.println("3"+"--"+nums[i]+"--"+map.get(nums[i]));
    }
    return set.size();
}

然后就可以啦~~(●ˇ∀ˇ●)

然后再介绍另一种思路,可以免去去重,首先我们重复的原因就是无法预知当前数是否会在后面出现,那我们直接把所有数的个数统计一遍不久可以了嘛:

        Map<Integer,Integer> map=new HashMap<>();
        int count=0;
        if(k<0)return count;
        for(int i=0;i<nums.length;i++){
               map.put(nums[i],map.getOrDefault(nums[i],0)+1);
        }

然后遍历各个数(键):

for(int i:map.keySet()){
    if(k==0){
        if(map.get(i)>1)
        count++;
    }
    else if(map.containsKey(i+k)){
        count++;
    }
}
return count;

注意这里只用判断map.containsKey(i+k)或map.containsKey(i-k)中的一个即可(避免【1,3】【3,1】这种重复)~

标签:map,set,nums,int,数对,力扣,--,532,containsKey
来源: https://blog.csdn.net/qq_39879315/article/details/112345040