返回
leetcode 219:存在重复元素 II,滑动窗口轻松掌握!
前端
2023-11-01 17:22:26
前言
作为一名技术爱好者,leetcode 是一个磨练编程技能的绝佳平台。今天,我们将共同探索 leetcode 上的 219. 存在重复元素 II,运用滑动窗口和 set 数据结构,深入理解算法的奥秘。
题目
- 存在重复元素 II 题目如下:
给定一个整数数组 nums 和一个正整数 k,找出是否有两个不同下标 i 和 j,使得 nums[i] = nums[j] 且 abs(i - j) <= k。
解题思路
为了解决这个问题,我们可以使用滑动窗口和 set 数据结构。
滑动窗口是一个连续的数组子序列,我们可以通过在数组中移动窗口来检查元素。set 数据结构可以帮助我们快速判断元素是否存在。
以下是具体步骤:
- 初始化滑动窗口和 set: 将滑动窗口大小设置为 k+1,并将前 k+1 个元素添加到 set 中。
- 遍历数组: 从 k+1 开始遍历数组。
- 检查元素是否在 set 中: 如果当前元素在 set 中,则表示存在重复元素,返回 true。
- 更新滑动窗口和 set: 将滑动窗口向右移动一位,并从 set 中删除最左边的元素。同时将当前元素添加到 set 中。
- 重复步骤 2-4, 直到遍历完整个数组。
- 返回 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 数据结构的使用方法,将大大提升你的算法技能。