219. 存在重复元素 II
class Solution {
public boolean containsNearbyDuplicate(int[] nums, int k) {
//题目要求找出两个不同的索引的数组元素 数组元素值相等
//并且 两个数组元素的索引值相差至多为k
//重复元素想到哈希表
//维护一个哈希表 哈希表最多只有K个元素
//当出现重复值 说明在k距离内 1 - k+ 1 存在重复元素
//每次遍历一个元素就将他放入哈希表 如果哈希表的大小大于k
//移除前面的元素
HashSet<Integer> set = new HashSet<>();
for(int i = 0; i < nums.length; i++)
{
//包含该元素 由于哈希表最大只有k 所以
//在k距离内存在重复元素
if(set.contains(nums[i]))
{
return true;
}
set.add(nums[i]);//哈希表不包含此元素 将该元素添加
if(set.size() > k)
{
//如果哈希表满了 前面元素移除
//因为匹配到该元素时 都没有存在重复元素
//就算后面又重复元素 他也不是 k距离范围内的重复元素
//所以前面的元素就可以扔掉 匹配后面的元素即可
//类似于一个滑动窗口 窗口大小为k 不断前进 遇到没有的元素添加
//相同的元素就说明存在重复元素
set.remove(nums[i - k]);
}
}
return false;
}
}