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;
}
};
本文探讨了如何在整数数组中查找是否存在两个不同的索引 i 和 j,使得 nums[i] = nums[j] 并且 i 和 j 之间的绝对差不超过 k。提出了三种解决方案:暴力法、使用 unordered_map 以及使用 unordered_set,分别分析了它们的时间复杂度。
669

被折叠的 条评论
为什么被折叠?



