题目:Contains Duplicate II
Given an array of integers and an integer k, find out whether there are two distinct indices i and j in the array such that nums[i] = nums[j]and the difference between i and j is at most k.
题目分析:若数组中存在两个元素相等且index值的差小于等于k返回true,否则返回false。
One:运用HashMap的方法
public class Solution {
public boolean containsNearbyDuplicate(int[] nums, int k) {
if(nums==null||nums.length==0)return false;
Map<Integer,Integer> map = new HashMap<Integer,Integer>();
for(int i = 0;i < nums.length;i++){
if(map.containsKey(nums[i])){
if(i-map.get(nums[i])<=k){
return true;
}else{
map.remove(nums[i]);
map.put(nums[i],i);
}
}
map.put(nums[i],i);
}
return false;
}
}
Two:了解了HashMap的put方法若键值已存在返回旧键值的value,不存在加入map,且返回null。进一步对代码进行优化如下:
public class Solution {
public boolean containsNearbyDuplicate(int[] nums, int k) {
Map<Integer,Integer> map = new HashMap<Integer,Integer>();
for(int i = 0;i < nums.length;i++){
Integer oldv = map.put(nums[i],i);
if(oldv!=null&&i - oldv <= k){
return true;
}
}
return false;
}
}
Three:用HashSet的方法,及时保持HashSet的长度小于等于k
public class Solution {
public boolean containsNearbyDuplicate(int[] nums, int k) {
Set<Integer> set = new HashSet<Integer>();
for(int i = 0;i < nums.length;i++){
if(i>k) set.remove(nums[i-k-1]);
if(!set.add(nums[i])) return true;
}
return false;
}
}
Four:对比两条语句放在前和后的区别
public boolean containsNearbyDuplicate(int[] nums, int k) {
HashSet<Integer> hs=new HashSet<>();
for(int i=0;i<nums.length;i++)
{
if(hs.add(nums[i])==false) return true;
if(hs.size()==k+1) hs.remove(nums[i-k]);
}
return false;
}