1.题目分析
这道题不难理解,仔细想,换句话说就是给定一个数组,若数组中两个相等元素的距离小于k,返回true,若在数组中不存在这个数,则返回false
这里肯定又有人要说话了,暴力解法直接得结果,但是这样显得太low了,我们可以换一种思想。
- 基本思想:
- 维护一个 大小为k的滑动窗口,那么什么是滑动窗口,下面给出图解。
这就是个滑动窗口,因为超过距离超过k的两个数我们根本不需要考虑,所以在窗口之外的数就和窗口内的美誉什么关系,接下来我们只需要向右移动这个窗口就行了,这样能节约很大的空间。 - 这个窗口我们可以用一个Set集合表示,set可以过滤掉重复的数。
2. 代码实现
2.1. Python代码
class Solution(object):
def containsNearbyDuplicate(self, nums, k):
"""
:type nums: List[int]
:type k: int
:rtype: bool
"""
window = []
for i in nums:
if i in window:
return True
if len(window) >= k:
if len(window) == 0:
continue
window.pop(0)
window.append(i)
return False
2.2. Java代码
class Solution {
public boolean containsNearbyDuplicate(int[] nums, int k) {
Set<Integer> set = new TreeSet<>();
for (int i = 0; i < nums.length; ++i) {
if (set.contains(nums[i])) return true;
set.add(nums[i]);
if (set.size() > k) {
set.remove(nums[i - k]);
}
}
return false;
}
}