给你一个整数数组 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
示例 3:
输入:nums = [1,2,3,1,2,3], k = 2 输出:false
提示:
1 <= nums.length <= 105
-109 <= nums[i] <= 109
0 <= k <= 105
一般写法
function containsNearbyDuplicate(nums: number[], k: number): boolean {
const numMap = new Map<number, number>();
for (let i = 0; i < nums.length; i++) {
const num = nums[i];
if (numMap.has(num) && i - numMap.get(num)! <= k) return true;
numMap.set(num, i);
}
return false;
}
用api
function containsNearbyDuplicate2(nums: number[], k: number): boolean {
const numMap = new Map<number, number>();
return nums.some((num, i) => {
if (numMap.has(num) && i - numMap.get(num)! <= k) return true;
numMap.set(num, i);
});
}
滑动窗口
//滑动窗口
function containsNearbyDuplicate3(nums: number[], k: number): boolean {
//保存窗口的内容,该Set里的值均满足索引 abs(i-j) <= k
const numSet = new Set<number>();
for (let i = 0; i < nums.length; i++) {
// i 为窗口滑动边界,当 i > k 时,该滑动窗口不满足 abs(i-j) <= k,所以要将 滑动窗口的最左侧值删除
if (i > k) numSet.delete(nums[i - k - 1]);
//如果滑动窗口中有这个值,则满足条件:nums[i] == nums[j]
if (numSet.has(nums[i])) return true;
//不满足条件,则向窗口添加此值
numSet.add(nums[i]);
}
return false;
}