【力扣时间】【219】【简单】存在重复元素II

简单的滑动窗口应用

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、总结

简单的滑动窗口+哈希表的实现。
不得不说,滑动窗口真的是很简单很易学且应用场景较广的思路,值得大家掌握。
而善于使用高级语言的各种封装好的数据结构,也能让做题变得更加轻而易举。

本想着年前最后一周,可以继续摸鱼的,结果来活了……

在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值