模拟滑动窗口
/*
* @lc app=leetcode.cn id=219 lang=java
*
* [219] 存在重复元素 II
*/
// @lc code=start
class Solution {
public boolean containsNearbyDuplicate(int[] nums, int k) {
/**
* 基本思路
* 模拟 动态滑动窗口
* 要求窗口左右两边的元素下标差,小于等于 k,即窗口的最大容量为 k + 1, 元素在数组中的下标范围[index, index + k]
* 存储结构类似队列,但由于需要快速定位元素是否存在,这里使用HashSet, 通过遍历前后的 下标来将窗口最左边的元素弹出
*/
// 存储当前窗口的元素,窗口长度 <= k
HashSet<Integer> map = new HashSet<>();
for(int i = 0; i < nums.length; i++)
{
int ele = nums[i];
// 如果存在,则说明存在符合要求的重复元素
if(map.contains(ele)){
return true;
}
// 将这个元素放入
map.add(ele);
// 如果元素的数量 为 k + 1时,说明,当前窗口内不存在符合要求的元素
if(map.size() == k + 1)
{
// 将窗口中最左边的元素弹出
map.remove(nums[i - k]);
}
}
return false;
}
}
// @lc code=end