Given an integer array nums and an integer k, return true if there are two distinct indices i and j in the array such that nums[i] == nums[j] and abs(i - j) <= k.
Example 1:
Input: nums = [1,2,3,1], k = 3
Output: true
Example 2:
Input: nums = [1,0,1,1], k = 1
Output: true
Example 3:
Input: nums = [1,2,3,1,2,3], k = 2
Output: false
Constraints:
1 <= nums.length <= 105
-109 <= nums[i] <= 109
0 <= k <= 105
思路:首先明确该题目的键值对为键:数值,值:下标。可以想一下,如果一个数跟之前的数一样,但是下标之差超过了K,我们该如何处理?1、冲突的哈希表,再次使用二维数组或者链表。2、如果再往后出现了一样的数字,那么这个数字跟第一次出现时肯定不满足条件,我们只需要判断该数字是否和前一次出现时的位置满足条件即可。所以代码如下:
#include <bits/stdc++.h>
class Solution {
public:
map<int,int> mp;
bool containsNearbyDuplicate(vector<int>& nums, int k) {
int len = nums.size();
for(int i=0; i<len; i++){
if(mp.count(nums[i]) > 0){
if(abs(mp[nums[i]]-i) <= k){
return true;
}else{
mp[nums[i]] = i;
}
}else{
mp.insert(make_pair(nums[i],i));
// cout<<i<<endl;
}
}
return false;
}
};