📜  资质 |门 CS 1998 |第 52 题(1)

📅  最后修改于: 2023-12-03 15:28:13.453000             🧑  作者: Mango

资质 | 门 CS 1998 | 第 52 题

题目描述

给定一个长度为 $n$ 的整型数组 $nums$ 和一个整数 $k$,请编写一个函数来查找该数组中是否存在两个不同的索引 $i$ 和 $j$,使得 $nums[i] = nums[j]$,并且 $|i - j| \leq k$。

函数签名
def contains_nearby_duplicate(nums: List[int], k: int) -> bool:
    pass
输入格式
  • nums 整型列表,长度 $n$,$(1 \leq n \leq 10^5)$;
  • k 整数 $(0 \leq k \leq 10^4)$。
输出格式

布尔值,表示是否存在满足条件的两个索引。

示例
示例1

输入:

nums = [1, 2, 3, 1]
k = 3

输出:True

解释:nums[0]=nums[3]=1,且|i-j|=3。

示例2

输入:

nums = [1, 0, 1, 1]
k = 1

输出:True

解释:nums[0]=nums[2],且|i-j|=2。(nums[1]=0与nums[2]=1相同,但不符合|i-j|\leq k。)

示例3

输入:

nums = [1, 2, 3, 1, 2, 3]
k = 2

输出:False

解法

该问题可以使用哈希表来解决。哈希表中的键是数字,而值是该数字最近一次出现的索引。

在进行一次数组迭代时,我们查找当前元素是否已经在哈希表中存在。如果存在,我们检查索引之间的差异是否大于 $k$。如果满足要求,则返回真。如果不满足要求,则将当前元素和索引添加到哈希表中。

代码实现
from typing import List

def contains_nearby_duplicate(nums: List[int], k: int) -> bool:
    num_index = {}
    for i, num in enumerate(nums):
        if num in num_index and i - num_index[num] <= k:
            return True
        num_index[num] = i
    return False

该函数接受两个参数:一个整型列表 nums 和一个整数 k。然后我们创建一个字典 num_index 并进行数组迭代,对于每个迭代项,我们在字典中检查当前数是否已经存在。如果存在,则如果当前索引减去存储的索引不大于 $k$,我们就可以返回 True。否则,我们将当前数和索引添加到字典中,并继续迭代数组。

最终,如果没有找到符合条件的数对,则函数返回 False