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,可以利用这一点进行一些判断
这种算法使用了一种非常好的思想: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,可以利用这一点进行一些判断
相关文章推荐
- 解析从源码分析常见的基于Array的数据结构动态扩容机制的详解
- javascript数组操作总结和属性、方法介绍
- mysql_fetch_assoc和mysql_fetch_row的功能加起来就是mysql_fetch_array
- JavaScript Array扩展实现代码
- JavaScript:Array类型全面解析
- JavaScript之数组(Array)详解
- Javascript实现Array和String互转换的方法
- C#中Array与ArrayList用法及转换的方法
- Array栈方法和队列方法的特点说明
- Array.prototype.slice 使用扩展
- Array, Array Constructor, for in loop, typeof, instanceOf
- 实例详解ECMAScript5中新增的Array方法
- Javascript数组Array基础介绍
- js Array的用法总结
- JS Array创建及concat()split()slice()的使用方法
- JavaScript 判断判断某个对象是Object还是一个Array
- Javascript中的Array数组对象详谈
- js模拟实现Array的sort方法
- 在javascript将NodeList作为Array数组处理的方法
- PHP array_multisort()函数的使用札记