存在重复元素 II
题目
给定一个整数数组和一个整数 k,判断数组中是否存在两个不同的索引 i 和 j,使得 nums [i] = nums [j],并且 i 和 j 的差的绝对值至多为 k。
示例
输入: nums = [1,2,3,1], k = 3
输出: true
题解
方法 1 线性搜索
(算法超时)根据题目要求将每个元素与它前面的 k 个元素进行比较,需要维护一个 k 大小的滑动窗口,然后在这个窗口里进行搜索。
方法 2 散列表
用散列表来维护这个 k 大小的滑动窗口,散列表支持在常量时间内完成搜索,删除,插入操作。
因此,遍历数组,对于每个元素做以下操作:
- 在散列表中搜索当前元素,如果找到了就返回 true。
- 在散列表中插入当前元素。
- 如果当前散列表的大小超过了 kk, 删除散列表中最旧的元素。返回 false。
代码
方法 1 线性搜索
class Solution {
public:
bool containsNearbyDuplicate(vector<int>& nums, int k) {
for(int i=0;i<nums.size();++i){
for(int j=max(i-k,0);j<i;++j){
if(nums[i]==nums[j]){
return true;
}
}
}
return false;
}
};
方法 2 散列表
class Solution {
public:
bool containsNearbyDuplicate(vector<int>& nums, int k) {
unordered_set<int> set;
for(int i=0;i<nums.size();++i){
if(set.find(nums[i])!=set.end()){
return true;
}
set.insert(nums[i]);
if(set.size()>k){
set.erase(nums[i-k]);
}
}
return false;
}
};