给定一个整数数组和一个整数 k,判断数组中是否存在两个不同的索引 i 和 j,使得 nums [i] = nums [j],并且 i 和 j 的差的 绝对值 至多为 k。
链接:https://leetcode-cn.com/problems/contains-duplicate-ii
解法1:
遍历nums,使用hash记录nums[i]的下标,如果nums[i]在hash中已经存在,比较下标差值。
class Solution {
public:
bool containsNearbyDuplicate(vector<int>& nums, int k) {
unordered_map<int, size_t> index;
for (size_t i = 0; i < nums.size(); ++i) {
auto iter = index.find(nums[i]);
if (iter != index.end()) {
if (i - iter->second <= k)
return true;
iter->second = i;
}
else {
index.insert({nums[i], i});
}
}
return false;
}
};
解法2:
遍历nums,将元素插入到set中,保持set的大小为不超过k,对于nums[i],如果已经在set中,则返回true
class Solution {
public:
bool containsNearbyDuplicate(vector<int>& nums, int k) {
unordered_set<int> s;
for (size_t i = 0; i < nums.size(); ++i) {
if (s.find(nums[i]) != s.end())
return true;
s.insert(nums[i]);
if (s.size() > k)
s.erase(nums[i - k]);
}
return false;
}
};