Given an array of integers and an integer k, find out whether there are two distinct indices i and j in the array such that nums[i] = nums[j] and the absolute difference between i and j is at most 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
两种方法的处理:map和set
map:
map直接寻找上次出现的相同的数是否和当前数序号差<=k
bool containsNearbyDuplicate(vector<int>& nums, int k) {
unordered_map<int,int>m;
for(int i=0;i<nums.size();++i){
if(m.find(nums[i])==m.end()){
m[nums[i]] = i;
}
else{
if(abs(m[nums[i]] - i)<=k){
return true;
}else{
m[nums[i]] = i;
}
}
}
return false;
}
set:
set维护一个大小为k的set,当i超过k时,每次移除掉最前面的数。当插入重复时,证明满足条件。
bool containsNearbyDuplicate(vector<int>& nums, int k) {
unordered_set<int>s;
for(int i=0;i<nums.size();++i){
if(i>k)s.erase(nums[i-k-1]);
if(!s.insert(nums[i]).second)return true;
}
return false;
}