Skip to content

219. 存在重复元素 II Easy

给你一个整数数组 nums 和一个整数 k ,判断数组中是否存在两个 不同的索引 ij ,满足 nums[i] == nums[j]abs(i - j) <= k 。如果存在,返回 true ;否则,返回 false

示例 1:
输入:nums = [1,2,3,1], k = 3
输出:true

示例 2:
输入:nums = [1,0,1,1], k = 1
输出:true

示例 3:
输入:nums = [1,2,3,1,2,3], k = 2
输出:false

解题思路

输入:一个整数数组 nums 和一个整数 k

输出:判断是否数组内有两个相等的数且距离小于 k

本题属于 数组+哈希表 问题。

  • 我们可以用一个哈希表存储遍历过的数字的坐标
  • 当新遍历的数字坐标与哈希表中相同的数字坐标距离小于 k 就返回 True
  • 否则就更新哈希表中当前数字的下标
  • 遍历完后都没找到则返回 False

代码实现

python
class Solution:
    def containsNearbyDuplicate(self, nums: List[int], k: int) -> bool:
        # 创建一个哈希表,用于记录每个数字上一次出现的位置
        index_map = {}

        # 遍历数组
        for i, num in enumerate(nums):
            # 如果当前数字之前出现过,且索引距离小于等于 k,返回 True
            if num in index_map and i - index_map[num] <= k:
                return True

            # 更新当前数字的索引
            index_map[num] = i

        # 遍历结束后没有找到符合条件的重复数字,返回 False
        return False
javascript
/**
 * @param {number[]} nums
 * @param {number} k
 * @return {boolean}
 */
var containsNearbyDuplicate = function(nums, k) {
    const indexMap = {};

    for (let i = 0; i < nums.length; i++) {
        if (indexMap[nums[i]] != null) {
            if (i - indexMap[nums[i]] <= k) {
                return true;
            }
        }

        indexMap[nums[i]] = i;
    }

    return false;
};

复杂度分析

时间复杂度:O(n)

空间复杂度:O(1)

链接

219 国际版

219 中文版