您的位置:首页 > 大数据 > 人工智能

leetcode--Contains Duplicate II

2016-12-14 16:44 239 查看
题目: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;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  leetcode