再探滑动窗口:【存在重复元素 II】

简介: 再探滑动窗口:【存在重复元素 II】

题目


给定一个整数数组和一个整数k,判断数组中是否存在两个不同的索引i和j,使得nums [i] = nums [j],并且 i 和 j的差的 绝对值 至多为 k。


解题思路


  • 维护一个哈希表,用来模拟滑动窗口,里面始终最多包含 k 个元素,滑动窗口的大小为k,当出现重复值时则说明在 k 距离内存在重复元素
  • 每次遍历一个元素则将其加入哈希表中,如果哈希表的大小大于 k,则移除最前面的数字,滑动窗口滑动
  • 时间复杂度:O(n)


代码实现

  public boolean containsNearbyDuplicate(int[] nums, int k) {
        HashSet<Integer> set = new HashSet<>();
        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;
    }


相关文章
|
API
代码随想录 Day10 栈与队列 LeetCode T239 滑动窗口的最大值 T347 前K个高频元素
代码随想录 Day10 栈与队列 LeetCode T239 滑动窗口的最大值 T347 前K个高频元素
48 0
|
搜索推荐
图解:快速排序算法之双边循环法
之前我们学习了冒泡排序,有没有比冒泡排序更快的排序算法呢?当然有,例如快速排序,归并排序,堆排序。接下来即将介绍的快速排序就是由冒泡排序演变而来的。
179 0
图解:快速排序算法之双边循环法
|
6月前
基础数据结构leetcode滑动窗口专题
基础数据结构leetcode滑动窗口专题
31 0
滑动窗口(单调队列)
滑动窗口(单调队列)
47 0
|
算法 索引
滑动窗口编程题集合(leetcode)
滑动窗口编程题集合(leetcode)
|
算法 索引
从五道leetcode掌握滑动窗口
可以看出,滑动窗口实际就是双指针同向移动的一种。可以想象,左右指针连接形成所谓的窗口,随着左右指针同时在数组中向后移动,就相当于窗口向后滑动,由此称为滑动窗口。值得注意的是,在指针向后的过程中,左右指针移动速度可以不同,所以窗口大小实际是不固定的。
|
机器学习/深度学习 算法 JavaScript
日拱算法,滑动窗口的最大值
日拱算法,滑动窗口的最大值
|
机器学习/深度学习 算法 搜索推荐
【数据结构与算法】之回溯、滑动窗口、分治算法经典问题
【数据结构与算法】之回溯、滑动窗口、分治算法经典问题
118 0
【数据结构与算法】之回溯、滑动窗口、分治算法经典问题
回溯法、另辟蹊径法 求数组的全排序
回溯法、另辟蹊径法 求数组的全排序
73 0
回溯法、另辟蹊径法 求数组的全排序
|
存储 索引
leetcode【栈与队列—困难】 239.滑动窗口
leetcode【栈与队列—困难】 239.滑动窗口
leetcode【栈与队列—困难】 239.滑动窗口