leecode中219题:存在重复元素2,
给你一个整数数组 nums 和一个整数 k ,判断数组中是否存在两个 不同的索引 i 和 j ,满足 nums[i] == nums[j] 且 abs(i - j) <= k 。如果存在,返回 true ;否则,返回 false 。
一开始自己暴力递归:直接双指针全局递归,结果超时了
class Solution {
public boolean containsNearbyDuplicate(int[] nums, int k) {
for(int i = 0;i<nums.length;i++){
for(int j = nums.length-1;j>i;j--){
if(nums[i]==nums[j]){
if(j-i<=k){
return true;
}
}
}
}
return false;
}
}
滑动窗口思想:首先新建一个set集合:遍历数组,将数组中的元素add进set中去
set中最多可以放k个元素,我们会在代码之前判断一次set是否可以加入这个nums[i],要是无法加入就说明是两个一样的值,然后直接返回true,因为我们保证set中只存放k个元素,超出的时候就把nums[i-k]个元素删掉,这样set就像是一个滑动窗口一样:
class Solution {
public boolean containsNearbyDuplicate(int[] nums, int k) {
Set<Integer> set = new HashSet<Integer>();
for(int i = 0;i<nums.length;i++){
if(!set.add(nums[i])){
return true;
}
set.add(nums[i]);
if(set.size()>k){
set.remove(nums[i-k]);
}
}
return false;
}
}