📌  相关文章
📜  检查给定数组是否包含彼此相距 k 距离内的重复元素(1)

📅  最后修改于: 2023-12-03 14:55:50.415000             🧑  作者: Mango

检查给定数组是否包含彼此相距 k 距离内的重复元素

在处理数组相关问题时,有时需要检查是否存在数组中相距一定距离内的重复元素。本文将介绍如何解决这类问题。

假设我们有一个整数数组 nums 和一个整数 k,要求检查数组中是否存在两个元素 nums[i]nums[j],它们的值相等且它们的索引之差小于或等于 k。若存在这样的一对元素,则返回 True,否则返回 False

解法一

最简单的方法是暴力枚举:对于任意的 ij,判断它们的值是否相等,且它们的索引之差是否小于或等于 k。时间复杂度为 $O(n^2)$,不够优秀。

下面给出解法一的 Python 代码实现:

def contains_nearby_duplicate(nums: List[int], k: int) -> bool:
    n = len(nums)
    for i in range(n):
        for j in range(i + 1, min(i + k + 1, n)):
            if nums[i] == nums[j]:
                return True
    return False
解法二

我们可以考虑使用哈希表来优化解法一。

具体来说,我们用一个哈希表 dict,来存储当前已经遍历过的元素的值和它们的下标。对于每一个新的元素 nums[i]

  • 判断 dict 中是否存在键 nums[i]
  • 如果存在键 nums[i],则判断 idict[nums[i]] 的差值是否小于或等于 k;如果是,则找到了符合要求的一对数,返回 True
  • 如果不存在键 nums[i],则在 dict 中添加键值对 (nums[i], i)

下面给出解法二的 Python 代码实现:

def contains_nearby_duplicate(nums: List[int], k: int) -> bool:
    n = len(nums)
    dict = {}
    for i in range(n):
        if nums[i] in dict and i - dict[nums[i]] <= k:
            return True
        dict[nums[i]] = i
    return False

解法二的时间复杂度是 $O(n)$,性能较好。

总结

本文介绍了两种解决数组中是否存在相距一定距离内的重复元素的方法:暴力枚举和哈希表。其中利用哈希表的方法性能更好,时间复杂度为 $O(n)$。

完整的 Python 代码如下:

from typing import List


def contains_nearby_duplicate(nums: List[int], k: int) -> bool:
    n = len(nums)
    dict = {}
    for i in range(n):
        if nums[i] in dict and i - dict[nums[i]] <= k:
            return True
        dict[nums[i]] = i
    return False

注:此处的 Markdown 格式不支持 Python 代码的高亮显示,建议使用其他支持该功能的 Markdown 编辑器查看。