【LeetCode】219. 存在重复元素 II

leetcode

 

解题思路

本题要求在整数数组中寻找满足以下条件的两个不同索引:元素值相等且索引差不超过 k。我们可以通过 ​​哈希表记录元素最后出现位置​​ 的方法高效解决这个问题。

 

关键步骤分析

  1. ​​哈希表维护​​:用 map 存储每个元素最后一次出现的索引。
  2. ​​滑动条件检查​​:遍历数组时,若当前元素已存在于哈希表中,且当前索引与记录索引的差值 ≤ k,则返回 true
  3. ​​动态更新​​:无论是否满足条件,每次都将当前元素的索引更新到哈希表中。

复杂度分析

  • ​​时间复杂度​​:O(n)
    每个元素遍历一次,哈希表的插入和查询操作均为 O(1)
  • ​​空间复杂度​​:O(n)
    最坏情况下需要存储所有元素的索引(例如所有元素均不重复)。

代码实现

func containsNearbyDuplicate(nums []int, k int) bool {
    // 创建哈希表,记录元素最后出现的索引
    lastIndex := make(map[int]int)

    for i, num := range nums {
        // 检查当前元素是否存在于哈希表中
        if j, exists := lastIndex[num]; exists {
            // 若索引差符合要求,直接返回 true
            if i - j <= k {
                return true
            }
        }
        // 更新当前元素的最后出现位置(无论是否满足条件)
        lastIndex[num] = i
    }
    return false
}

代码说明

  1. ​​哈希表初始化​​:lastIndex 用于存储元素最后出现的索引。
  2. ​​遍历逻辑​​:对每个元素检查是否存在哈希表记录,若存在则计算索引差。
  3. ​​更新策略​​:无论是否满足条件,都需要更新当前元素的索引,以保持哈希表记录最新位置。

运行示例

func main() {
    // 示例测试
    example1 := []int{1,2,3,1}
    fmt.Println(containsNearbyDuplicate(example1, 3)) // 输出: true

    example2 := []int{1,0,1,1}
    fmt.Println(containsNearbyDuplicate(example2, 1)) // 输出: true

    example3 := []int{1,2,3,1,2,3}
    fmt.Println(containsNearbyDuplicate(example3, 2)) // 输出: false

    // 边界测试:k=0
    fmt.Println(containsNearbyDuplicate([]int{1,1}, 0)) // 输出: false

    // 边界测试:所有元素相同
    fmt.Println(containsNearbyDuplicate([]int{5,5,5,5}, 1)) // 输出: true
}
true
true
false
false
true 

示例解析

  • ​​示例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)
posted @ 2025-05-26 21:12  云隙之间  阅读(12)  评论(0)    收藏  举报