【LeetCode-数组】存在重复元素 II

题目描述

给定一个整数数组和一个整数 k,判断数组中是否存在两个不同的索引 i 和 j,使得 nums [i] = nums [j],并且 i 和 j 的差的 绝对值 至多为 k。
示例:

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

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

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

题目链接: https://leetcode-cn.com/problems/contains-duplicate-ii/

思路

使用哈希表来做,哈希表的 key 为数组中的元素,value 为元素对应的下标,例如 hash[nums[i]] = i. 算法如下:

  • 遍历数组:
    • 如果当前元素 nums[i] 不在哈希表中,则将当前元素加入到哈希表中,也就是 hash[nums[i]] = i;
    • 如果当前元素 nums[i] 在哈希表中:
      • 如果 i - hash[nums[i]] <= k,则返回 true;
      • 否则,更新 hash[nums[i]] 为 i;(不更新的话类似于[1, 0, 1 , 1, 0], 1 这样的例子会通不过)
  • 返回 false。

代码如下:

class Solution {
public:
    bool containsNearbyDuplicate(vector<int>& nums, int k) {
        if(nums.empty()) return false;

        unordered_map<int, int> hash;
        for(int i=0; i<nums.size(); i++){
            if(hash.find(nums[i])!=hash.end()){
                if(i-hash[nums[i]]<=k) return true;
                else hash[nums[i]] = i;
            }else{
                hash[nums[i]] = i;
            }
        }
        return false;
    }
};
  • 时间复杂度:O(n)
  • 空间复杂度:O(n)
原文地址:https://www.cnblogs.com/flix/p/12912910.html