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

LeetCode - 219. Contains Duplicate II

2016-07-02 10:47 316 查看
这道题目时间复杂度较高的方法比较容易想到,i从1到k,逐次检查相隔i的元素是否相等,但是这个必然不是最优的解法,代码不是很难,这里就不写了。着重要说的是第二种时间复杂度最差为O(n)的算法。

这种算法使用了一种非常好的思想:sliding windows,也就是说我们从数组的开头开始迭代,并且将设置一个大小从i到i + k总共k + 1个元素的sliding windows,每次继续迭代的时候,就将nums[i - k - 1]也就是最早添加进来的元素删除掉,并且添加下一个元素,如果下一个元素添加成功,那么说明是没有题目要求的duplicate的,如果添加失败,则说明发现了距离最大为k的重复。这里利用了Java中Set的特性和sliding windows的思想,是时间复杂度最差达到了O(n),代码如下:

public class Solution{
public boolean containsNearbyDuplicate(int[] nums, int k){
if(nums == null || nums.length == 0) return false;

Set<Integer> set = new HastSet<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;
}
}

知识点:

1. 在题目中有提到关于相隔k之类的条件或要求,就可以考虑这种sliding windows的思想

2. Java中Set是一个接口,无法进行实例化,需要用实现了Set的接口对它进行实例化,比如这道题目中的HashSet,另外也要明白Set不能包含重复元素的特性,如果再次调用add函数向其中添加已有的元素的话,返回值是false,可以利用这一点进行一些判断
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息