219. 存在重复元素 II
这道题可以用两个方法解决。
- 哈希表
从左到右遍历数组,并将数组的下标存到hash中,在遍历数字的过程中,如果hash中不存在nums[i],将nums[i]加入到hash当中,若存在,则判断下标之间的关系即可。
class Solution {
public:bool containsNearbyDuplicate(vector<int>& nums, int k) {unordered_map<int, int> hash;for (int i = 0; i < nums.size(); i++){if (hash.count(nums[i])){if (i - hash[nums[i]] <= k) return true;}hash[nums[i]] = i;}return false;}
};
- 滑动窗口
要满足ABS(I - J) <= K,可以想象一个窗口,窗口中的数字必然满足条件。当nums中的每个长度不超过k + 1的滑动窗口,同一个滑动窗口中的任意两个下标差绝对不会超过k。
class Solution {
public:bool containsNearbyDuplicate(vector<int>& nums, int k) {unordered_set<int> s;int length = nums.size();for (int i = 0; i < length; i++) {if (i > k) {s.erase(nums[i - k - 1]);}if (s.count(nums[i])) {return true;}s.emplace(nums[i]);}return false;}
};