219. 存在重复元素 II

1. 题目

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

示例 1:

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

示例 2:

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

示例 3:

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

提示:

  • 1 <= nums.length <= 10^5
  • -10^9 <= nums[i] <= 10^9
  • 0 <= k <= 10^5

2. 思路

  • 初始化哈希表map用于记录数值出现的下标位置

  • 遍历nums数组,判断哈希表中是否存在该数值,如果存在该值,则判断该值下标位置与当前值下标位置是否满足题目要求的abs(i - j) <= k条件

    • 如果满足,则直接返回结果true
    • 如果不满足,则将当前数值放入哈希表中
  • 将当前数值下标放置入哈希表可能会存在覆盖的情况,但没关系因为始终要保证两个数值的下标距离尽可能的小,以此满足题目abs(i - j) <= k条件

3. 代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
class Solution {
public boolean containsNearbyDuplicate(int[] nums, int k) {
var map = new HashMap<Integer, Integer>();

for (var i = 0; i < nums.length; ++i) {
if (map.containsKey(nums[i]) && i - map.get(nums[i]) <= k) {
return true;
}
map.put(nums[i], i);
}

return false;
}
}

4. 复杂度

  • 时间复杂度:O(n)
  • 空间复杂度:O(n)

image-20230902002338538