一、题目
给你一个整数数组 nums 和一个整数 k ,判断数组中是否存在两个 不同的索引 i 和 j ,满足 nums[i] == nums[j] 且 abs(i - j) <= k 。如果存在,返回 true ;否则,返回 false 。
示例 1:
输入:nums = [1,2,3,1], k = 3
输出:true
示例 2:
输入:nums = [1,0,1,1], k = 1
输出:true
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/contains-duplicate-ii
二、思路
方法一是不借助额外的空间进行查找,每遍历一个数组中的元素,就在其后的k个元素中用find方法进行查找,若能找到,则说明存在;若遍历完数组都找不到,则说明不存在。
方法二是借助set作为滑动窗口,其大小始终小于等于k,遍历数组,每遍历一个元素,就在set中进行查找,若能找到相同的元素,则返回true;若找不到,当前下标小于等于k时,直接将元素插入set,下标大于k时,将nums[i-k](最早进入set的元素)从set中删除,将当前值插入set中,若遍历完数组都找不到满足条件的值,则返回false。
三、代码
原地查找方式:
class Solution {
public:
bool containsNearbyDuplicate(vector<int>& nums, int k) {
int len = nums.size();
if(k == 0) return false;
vector<int>::iterator it = nums.begin();
for(int i=0; i<len-1; i++){
auto end = min(it + len, it + i + k +1);
auto tmp = find(it + i +1, end, nums[i]);
if(tmp != end){
return true;
}
}
return false;
}
};
借助set方式:
class Solution {
public:
bool containsNearbyDuplicate(vector<int>& nums, int k) {
unordered_set<int> st;
for(int i=0; i<nums.size(); i++){
if(st.count(nums[i])){
return true;
}
st.insert(nums[i]);
if(st.size() > k){
st.erase(nums[i-k]);
}
}
return false;
}
};
四、运行结果