简单的滑动窗口应用
1、康题
由于是简单题,而且题意也很清楚,所以我们还是快速地过好了。
2、思路
做法不会唯一,但思路估计会挺相似。
首先我们肯定会想到,既然要匹配是否有相同的两个数,那么我们把数组中出现的数都记录下来即可。
而由于还有下标的距离限制,所以我们可以缓存每个数和其对应的下标,一旦遇到相同的数,就比较下标是否在K这个范围内。
这是简单而基础的想法,当然也可以解决这道题。
只是在1 <= nums.length <= 105和-109 <= nums[i] <= 109这个数量级下,时间消耗和空间消耗会很大。
辣么,就用滑动窗口的思路取优化一下。
既然我们只需判断索引范围在K(包含K)以内的数据,我们大可以只记录K+1 个元素,每次滑动时,将最前面的元素移出,添加新元素时,让其和已有的元素比较。如果有重复,则返回true;如果不重复,则将新元素添加入窗口内,并继续向后滑动。
3、直接上手
class Solution {
public boolean containsNearbyDuplicate(int[] nums, int k) {
Set<Integer> set = new HashSet<>();
for (int i = 0; i < nums.length; i++) {
//当i大于k时,说明窗口已经够大
if (i > k) {
//移除滑出的元素
set.remove(nums[i - k - 1]);
}
if (set.contains(nums[i])) {
return true;
} else {
//将新元素加入窗口
set.add(nums[i]);
}
}
return false;
}
}
4、提交
时间复杂度O(N),空间复杂度O(K)。
5、看看大佬吧
虽然耗时排名没能做到100%,但题解区的大牛们基本上也都是同样的思路,没有看到什么黑科技。
所以,看我的就行!
6、总结
简单的滑动窗口+哈希表的实现。
不得不说,滑动窗口真的是很简单很易学且应用场景较广的思路,值得大家掌握。
而善于使用高级语言的各种封装好的数据结构,也能让做题变得更加轻而易举。
本想着年前最后一周,可以继续摸鱼的,结果来活了……