2018-09-06 13:23:43 +00:00
|
|
|
|
# [219. Contains Duplicate II](https://leetcode.com/problems/contains-duplicate-ii/description/)
|
|
|
|
|
# 思路
|
2020-07-08 01:04:56 +00:00
|
|
|
|
判断数组是否有重复元素,而且重复元素下标差的绝对值不大于k。
|
|
|
|
|
|
|
|
|
|
## 思路一
|
|
|
|
|
为了记录元素到下标的映射,我们可以使用hashmap,key即元素值,value即该元素的下标,这样就很方便的判断某元素是否出现过且下标差是否不大于k。
|
|
|
|
|
|
|
|
|
|
hashmap的为常数时间复杂度,所以总的时间复杂度为O(n)
|
|
|
|
|
|
|
|
|
|
## 思路二
|
|
|
|
|
还也可以用pair记录数组元素的值和下标,然后再对所有pair按照元素值的大小进行排序,排序后重复元素肯定相邻,再判断下标是否满足条件即可。
|
|
|
|
|
|
|
|
|
|
由于要排序,所以时间复杂度为O(nlogn)
|
|
|
|
|
|
2018-09-06 13:23:43 +00:00
|
|
|
|
# C++
|
2020-07-08 01:04:56 +00:00
|
|
|
|
|
|
|
|
|
## 思路一
|
2019-09-13 15:08:41 +00:00
|
|
|
|
``` C++
|
2018-09-06 13:23:43 +00:00
|
|
|
|
class Solution {
|
|
|
|
|
public:
|
|
|
|
|
bool containsNearbyDuplicate(vector<int>& nums, int k) {
|
2020-07-08 01:04:56 +00:00
|
|
|
|
unordered_map<int, int>mp;
|
2018-09-06 13:23:43 +00:00
|
|
|
|
for(int i = 0; i < nums.size(); i++){
|
2020-07-08 01:04:56 +00:00
|
|
|
|
auto iter = mp.find(nums[i]);
|
|
|
|
|
if(iter != mp.end() && i - iter -> second <= k) return true;
|
|
|
|
|
mp[nums[i]] = i;
|
2018-09-06 13:23:43 +00:00
|
|
|
|
}
|
2020-07-08 01:04:56 +00:00
|
|
|
|
return false;
|
|
|
|
|
}
|
|
|
|
|
};
|
|
|
|
|
```
|
|
|
|
|
|
|
|
|
|
## 思路二
|
|
|
|
|
``` C++
|
|
|
|
|
class Solution {
|
|
|
|
|
public:
|
|
|
|
|
bool containsNearbyDuplicate(vector<int>& nums, int k) {
|
|
|
|
|
vector<pair<int, int>>num_is;
|
|
|
|
|
for(int i = 0; i < nums.size(); i++) num_is.push_back({nums[i], i});
|
|
|
|
|
|
|
|
|
|
sort(num_is.begin(), num_is.end()); // 默认会按照pair的第一个值进行排序
|
2018-09-06 13:23:43 +00:00
|
|
|
|
for(int i = 1; i < nums.size(); i++)
|
2020-07-08 01:04:56 +00:00
|
|
|
|
if(num_is[i].first == num_is[i-1].first &&
|
|
|
|
|
abs(num_is[i].second - num_is[i-1].second) <= k) return true;
|
2018-09-06 13:23:43 +00:00
|
|
|
|
return false;
|
|
|
|
|
}
|
|
|
|
|
};
|
|
|
|
|
```
|