【LeetCode】219. 存在重复元素 II
解题思路
本题要求在整数数组中寻找满足以下条件的两个不同索引:元素值相等且索引差不超过 k。我们可以通过 哈希表记录元素最后出现位置 的方法高效解决这个问题。
关键步骤分析
- 哈希表维护:用
map存储每个元素最后一次出现的索引。 - 滑动条件检查:遍历数组时,若当前元素已存在于哈希表中,且当前索引与记录索引的差值
≤ k,则返回true。 - 动态更新:无论是否满足条件,每次都将当前元素的索引更新到哈希表中。
复杂度分析
- 时间复杂度:
O(n)
每个元素遍历一次,哈希表的插入和查询操作均为O(1)。 - 空间复杂度:
O(n)
最坏情况下需要存储所有元素的索引(例如所有元素均不重复)。
代码实现
代码说明
- 哈希表初始化:
lastIndex用于存储元素最后出现的索引。 - 遍历逻辑:对每个元素检查是否存在哈希表记录,若存在则计算索引差。
- 更新策略:无论是否满足条件,都需要更新当前元素的索引,以保持哈希表记录最新位置。
运行示例
示例解析
- 示例1:
nums[0] = nums[3],索引差为 3,满足k=3。 - 示例2:
nums[2] = nums[3],索引差为 1,满足k=1。 - 示例3:所有重复元素的索引差均为 3,超过
k=2。 - 边界测试1:
k=0要求索引差必须为 0,但题目要求不同索引,故返回false。 - 边界测试2:所有元素相同且
k=1,相邻元素即可满足条件。
扩展思考
若进一步要求空间复杂度优化,可采用 滑动窗口法(维护最多包含 k+1 个元素的窗口)。此方法通过固定窗口大小减少哈希表存储量:
func containsNearbyDuplicateOptimized(nums []int, k int) bool { window := make(map[int]bool) for i, num := range nums { if i > k { // 移除窗口外元素 delete(window, nums[i-k-1]) } if window[num] { return true } window[num] = true } return false }
- 时间复杂度:
O(n),但需要频繁操作哈希表。 - 适用场景:当
k较小时,空间复杂度可优化为O(k)。

浙公网安备 33010602011771号