题意
给定一个数组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;
}
};

本文介绍两种高效算法,用于判断一数组内是否存在两个下标之差不超过k的相同元素。第一种算法通过排序pair<int,int>实现,时间复杂度O(nlogn);第二种算法使用unordered_map存储元素及其最新位置,实现O(n)时间复杂度。
&spm=1001.2101.3001.5002&articleId=55225099&d=1&t=3&u=6629a3b2b490462990d36e2829748468)
461

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



