力扣解题思路: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