给定一个整数数组和一个整数 k,判断数组中是否存在两个不同的索引 i 和 j,使得 nums [i] = nums [j],并且 i 和 j 的差的绝对值最大为 k。
示例 1:
输入: nums = [1,2,3,1], k = 3
输出: true
示例 2:
输入: nums = [1,0,1,1], k = 1
输出: true
示例 3:
输入: nums = [1,2,3,1,2,3], k = 2
输出: false
- 滑动窗口——控制set集合size
class Solution {
public:
bool containsNearbyDuplicate(vector<int>& nums, int k) {
if(nums.size()==0) return false;
unordered_set<int>result;
for(int i=0; i<nums.size(); i++)
{
if(result.find(nums[i])==result.end())
result.insert(nums[i]);
else
return true;
if(result.size()>k)
result.erase(nums[i-k]);
}
return false;
}
};
复杂度分析:
时间复杂度:O(n)
空间复杂度:O(min(n,k))
注:也可以用双指针控制滑动窗口的大小
class Solution {
public:
bool containsNearbyDuplicate(vector<int>& nums, int k) {
if(nums.size()==0) return false;
unordered_set<int>result;
int i = 0;
int j = 1;
result.insert(nums[0]);
while(j<nums.size())
{
int temp = nums[i];
if(j-i<=k)
{
if(result.find(nums[j])==result.end())
result.insert(nums[j]);
else
return true;
}
if(j-i==k)
{
result.erase(nums[i]);
i++;
}
j++;
}
return false;
}
};