题意
给定一个数组nums和一个数k,判断是否存在 numsi=numsj 且 |j−i|≤k 。
思路
算法1
建立一个pair<int, int>
为
numsi
和
i
,我们排序
算法2
用unordered_map
存储元素x最后一次出现的下标,每次
O(1)
的去查找和判断就可以了。
时间复杂度 O(n) 。
代码
//algorithm 1
class Solution {
public:
bool containsNearbyDuplicate(vector<int>& nums, int k) {
vector<pair<int, int>> a;
for (int i = 0; i < nums.size(); i++) a.push_back(make_pair(nums[i], i));
sort(a.begin(), a.end());
for (int i = 1; i < nums.size(); i++) {
if (a[i].first == a[i - 1].first) if (abs(a[i].second - a[i - 1].second) <= k) return true;
}
return false;
}
};
//algorithm 2
class Solution {
public:
bool containsNearbyDuplicate(vector<int>& nums, int k) {
unordered_map<int, int> vis;
for (int i = 0; i < nums.size(); i++) {
int x = nums[i];
if (vis.count(x)) {
if (i - vis[x] <= k) return true;
}
vis[x] = i;
}
return false;
}
};