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

【leetcode】Array——Contains Duplicate II(219)

2016-03-13 10:16 453 查看
题目: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.

思路1:用HashMap<integer,Integer>存放nums[i]和i,当nums[i]再次出现时,比较map中的value和i

代码1:速度慢

public boolean containsNearbyDuplicate(int[] nums, int k) {
Map<Integer,Integer> map = new HashMap<>();
for(int i=0;i<nums.length;i++){
Integer index = map.get(nums[i]);
if(index==null)
map.put(nums[i], i);
else{
if(i-index<=k)
return true;
else
map.put(nums[i],i);
}
}

return false;
}


思路2:用set,并保持map的大小为k+1,相当于维护了一个windows,判断读取的下一个nums[i]是否在set中。

代码2:速度较快,比第一个思路要快

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;
}


思路3:自己构造一个数据结构,包含两个成员变量,nums[i]和i。然后根据nums[i]排序,判断相连且nums[i]相同的对象的i差值是否大于k

代码3:速度很快,比思路2的解法要快

public class Solution {
public class MyArr {
int data;
int index;
}

class mycmp implements Comparator<MyArr> {
@Override
public int compare(MyArr o1, MyArr o2) {
return o1.data - o2.data;
}
}

public boolean containsNearbyDuplicate(int[] nums, int k) {
int len = nums.length;
MyArr[] myArrs = new MyArr[len];
for (int i = 0; i < len; ++i) {
myArrs[i] = new MyArr();
myArrs[i].data = nums[i];
myArrs[i].index = i;
}
Arrays.sort(myArrs, 0, len, new mycmp());
for (int i = 0; i < len - 1; i++) {
if (myArrs[i].data == myArrs[i + 1].data
&& Math.abs((myArrs[i].index - myArrs[i + 1].index)) <= k)
return true;
}
return false;
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: