难度:简单
给你一个整数数组 nums
和一个整数 k
,判断数组中是否存在两个 不同的索引 i
和 j
,满足 nums[i] == nums[j]
且 abs(i - j) <= k
。如果存在,返回 true
;否则,返回 false
。
输入:nums = [1,2,3,1], k = 3
输出:true
输入:nums = [1,0,1,1], k = 1
输出:true
输入:nums = [1,2,3,1,2,3], k = 2
输出:false
/**
* 哈希表
* @desc 时间复杂度 O(N) 空间复杂度 O(N)
* @param nums
* @param k
* @returns
*/
export function containsNearbyDuplicate(nums: number[], k: number): boolean {
const map = new Map<number, number>()
for (let i = 0; i < nums.length; i++) {
const val = nums[i]
if (map.has(val) && i - map.get(val)! <= k)
return true
else
map.set(val, i)
}
return false
}
/**
* 滑动窗口
* @desc 时间复杂度 O(N) 空间复杂度 O(K)
* @param nums
* @param k
* @returns
*/
export function containsNearbyDuplicate2(nums: number[], k: number): boolean {
const set = new Set<number>()
for (let i = 0; i < nums.length; i++) {
if (i > k)
set.delete(nums[i - k - 1])
if (set.has(nums[i]))
return true
set.add(nums[i])
}
return false
}