标签:map set nums int 数对 力扣 -- 532 containsKey
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
本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享; 2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关; 3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关; 4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除; 5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。