leetcode 219. 存在重复元素 II

https://leetcode-cn.com/problems/contains-duplicate-ii/

题目

给定一个整数数组和一个整数 k,判断数组中是否存在两个不同的索引 i 和 j,使得 nums [i] = nums [j],并且 i 和 j 的差的 绝对值 至多为 k。

示例

1
2
输入: nums = [1,2,3,1], k = 3
输出: true

解一:Map哈希表

思路

维护一个哈希表存储 【值:索引】对
初始化将nums[0]加入
扫描数组

  • 如果扫描到在哈希表中的数据,判断是否距离超过k
  • 没超过,返回true
  • 超过,更新键值对的索引值
  • 如果扫描到不在哈希表中的数据,将它加入
    返回false

代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
/**
* @param {number[]} nums
* @param {number} k
* @return {boolean}
*/
var containsNearbyDuplicate = function(nums, k) {
//哈希法
let map=new Map();
map.set(nums[0],0)
for (let i=1;i<nums.length;i++){
//如果不在map中,加入
if (map.get(nums[i])!==undefined){
if (i-map.get(nums[i])<=k) return true;
}
map.set(nums[i],i)
}
return false
};

解二:Set类滑动窗口,算哈希吧

思路

维护一个哈希表,里面至多包含k个元素
出现重复值时返回true
如果哈希表中存在大于k个元素,移除最前面的数

代码

1
2
3
4
5
6
7
8
9
10
11
var containsNearbyDuplicate = function(nums, k) {
//哈希法
let set=new Set();
for (let i=0;i<nums.length;i++){
//如果不在set中,加入
if (set.has(nums[i])) return true;
set.add(nums[i])
if(set.size>k) set.delete(nums[i-k])
}
return false
};
------ 本文结束 ❤ 感谢你的阅读 ------
------ 版权信息 ------

本文标题:leetcode 219. 存在重复元素 II

文章作者:Lury

发布时间:2021年07月29日 - 18:27

最后更新:2022年04月09日 - 19:19

原始链接:https://luryzhu.github.io/2021/07/29/leetcode/leetcode8/

许可协议:署名-非商业性使用-禁止演绎 4.0 国际 转载请保留原文链接及作者。