携手创作,共同成长!这是我参与「掘金日新计划 · 8 月更文挑战」的第18天,点击查看活动详情
题目(Contains Duplicate II)
链接:https://leetcode-cn.com/problems/contains-duplicate-ii
解决数:1596
通过率:44.4%
标签:数组 哈希表 滑动窗口
相关公司:facebook google amazon
给你一个整数数组 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] <= 1090 <= k <= 105
思路
- 维护一个哈希表,里面始终最多包含
k个元素,当出现重复值时则说明在k距离内存在重复元素 - 每次遍历一个元素则将其加入哈希表中,如果哈希表的大小大于
k,则移除最前面的数字 - 时间复杂度:, 为数组长度
代码
class Solution {
public boolean containsNearbyDuplicate(int[] nums, int k) {
HashSet set = new HashSet<>();
for(int i = 0; i < nums.length; i++) {
if(set.contains(nums[i])) {
return true;
}
set.add(nums[i]);
if(set.size() > k) {
set.remove(nums[i - k]);
}
}
return false;
}
}
/**
* @param {number[]} nums
* @param {number} k
* @return {boolean}
*/
var containsNearbyDuplicate = function(nums, k) {
const set = new Set();
for(let i = 0; i < nums.length; i++) {
if(set.has(nums[i])) {
return true;
}
set.add(nums[i]);
if(set.size > k) {
set.delete(nums[i - k]);
}
}
return false;
};
用 Set 结构保存最大 k 个数,超过 k 个数,删除最早存进来的数, 一旦发现即将存入的数在 Set 中有相等的值,直接结束遍历,返回 true
var containsNearbyDuplicate = function(nums, k) {
let hash = new Set(), ans = false;
for (let i = 0, n = nums.length; i < n; i++) {
if (hash.has( nums[i] )) {
ans = true;
break;
}
hash.add( nums[i] );
if (hash.size > k) {
hash.delete( nums[i - k] );
}
}
return ans;
}
维护一个长度为k+1的集合作为窗口,判断是否出现重复,元素个数满了的话弹出k+1个前的数字
/**
* @param {number[]} nums
* @param {number} k
* @return {boolean}
*/
var containsNearbyDuplicate = function(nums, k) {
const set = new Set()
for(let i = 0; i < nums.length; i++){
if(set.size == k + 1)
set.delete(nums[i - k - 1])
if(set.has(nums[i]))
return true
set.add(nums[i])
}
return false
};