📜  门| GATE-CS-2014-(Set-3) |问题 8(1)

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

题目描述

给定一个整数数组nums和一个整数k,请判断是否存在两个不同的索引i和j,使得nums [i] = nums [j],并且i和j之间的差的绝对值不超过k。

函数签名
def contains_nearby_duplicate(nums, k) -> bool:
示例

输入:

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

输出:

True

说明:在位置0和位置3处都有数字1。

解题思路

定义一个字典 dic ,表示每个元素最后出现的位置。遍历数组,如果当前位置记为 i,若nums[i]已经在 dic 中出现过,判断上一次出现的位置记为 j 是否满足 i - j <=k , 如果满足就返回 True,否则更新dic[nums[i]] = i

解法实现
def contains_nearby_duplicate(nums, k) -> bool:
    dic = {}
    for i in range(len(nums)):
        if nums[i] in dic and i - dic[nums[i]] <= k:
            return True
        dic[nums[i]] = i
    return False
复杂度分析

时间复杂度:O(n),其中n为数组的长度。

空间复杂度:O(min(n,k)),其中k为题目中给定的距离,因为只要字典中的元素数量不超过k+1,就不会造成溢出。在最坏情况下,即nums中的k个元素均不相同,所以最后得到的字典的长度为min(n,k)。