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 difference between i and j is at most k.
1.暴力法O(n^2)
class Solution {
public:
bool containsNearbyDuplicate(vector<int>& nums, int k) {
const int size = nums.size();
if(size < 2 || k == 0)
return false;
for(int i=0, j=i+k; i<size; ++i, ++j){
for(int k=i+1; k<=j && k < size; ++k){
if(nums[i] == nums[k])
return true;
}
}
return false;
}
};
时间太长,通不过。
2.unordered_map O(n)
class Solution {
public:
bool containsNearbyDuplicate(vector<int>& nums, int k) {
const int size = nums.size();
if(size < 2 || k <= 0)
return false;
unordered_map<int, int> ump;
for(int i=0; i<size; ++i){
if(ump.count(nums[i]) != 0 && i - ump[nums[i]] <= k)
return true;
else
ump[nums[i]] = i;
}
return false;
}
};
3.unorder_set 和上面类似,也是O(n)
class Solution {
public:
bool containsNearbyDuplicate(vector<int>& nums, int k) {
const int size = nums.size();
if(size < 2 || k <= 0)
return false;
set<int> s;
for(int i=0; i<size; ++i){
if(i > k)
s.erase(nums[i-k-1]);
if(!s.insert(nums[i]).second)
return true;
}
return false;
}
};