返回

leetcode 219:存在重复元素 II,滑动窗口轻松掌握!

前端

前言

作为一名技术爱好者,leetcode 是一个磨练编程技能的绝佳平台。今天,我们将共同探索 leetcode 上的 219. 存在重复元素 II,运用滑动窗口和 set 数据结构,深入理解算法的奥秘。

题目

  1. 存在重复元素 II 题目如下:

给定一个整数数组 nums 和一个正整数 k,找出是否有两个不同下标 i 和 j,使得 nums[i] = nums[j] 且 abs(i - j) <= k。

解题思路

为了解决这个问题,我们可以使用滑动窗口和 set 数据结构。

滑动窗口是一个连续的数组子序列,我们可以通过在数组中移动窗口来检查元素。set 数据结构可以帮助我们快速判断元素是否存在。

以下是具体步骤:

  1. 初始化滑动窗口和 set: 将滑动窗口大小设置为 k+1,并将前 k+1 个元素添加到 set 中。
  2. 遍历数组: 从 k+1 开始遍历数组。
  3. 检查元素是否在 set 中: 如果当前元素在 set 中,则表示存在重复元素,返回 true。
  4. 更新滑动窗口和 set: 将滑动窗口向右移动一位,并从 set 中删除最左边的元素。同时将当前元素添加到 set 中。
  5. 重复步骤 2-4, 直到遍历完整个数组。
  6. 返回 false: 如果遍历完数组后没有找到重复元素,则返回 false。

代码示例

def containsNearbyDuplicate(nums, k):
    window_size = k + 1
    window = set(nums[:window_size])
    for i in range(window_size, len(nums)):
        if nums[i] in window:
            return True
        window.remove(nums[i - window_size])
        window.add(nums[i])
    return False

时间复杂度

算法的时间复杂度为 O(n),其中 n 为数组 nums 的长度。

空间复杂度

算法的空间复杂度为 O(k),因为 set 数据结构最多存储 k 个元素。

总结

通过利用滑动窗口和 set 数据结构,我们可以轻松地解决 leetcode 上的 219. 存在重复元素 II。这种解题思路不仅适用于本题,还可以拓展到解决其他类似问题。掌握滑动窗口和 set 数据结构的使用方法,将大大提升你的算法技能。