力扣刷题Days8第二题--219. 存在重复元素 II(js)

文章介绍了如何通过自定义哈希算法和滑动窗口技巧解决编程问题,判断给定数组中是否存在两个不同的索引,其数值相等且差的绝对值小于给定k。作者提供了初版哈希法、改进版哈希法以及利用Set实现的滑动窗口方法,并对Map和Set的数据结构进行了补充说明。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

目录

1,题目

2,代码

2.1自己完成的哈希算法--初版

2,哈希算法--改进版

3,滑动窗口

3,学习与总结

3.1Map()函数补充

3.2 Set()基础补充


1,题目

给你一个整数数组 nums 和一个整数 k ,判断数组中是否存在两个 不同的索引 i 和 j ,满足 nums[i] == nums[j] 且 abs(i - j) <= k 。如果存在,返回 true ;否则,返回 false 。


2,代码

2.1自己完成的哈希算法--初版

问题: 代码相对冗余

进步:可以凭借 例子,分析 逻辑,自己动手 码代码了!

/**
 * @param {number[]} nums
 * @param {number} k
 * @return {boolean}
 */
var containsNearbyDuplicate = function(nums, k) {
    const hashtable = new Map();
    for(let i = 0;i<nums.length;i++){
        if(hashtable.has(nums[i])){
            if(i-hashtable.get(nums[i]) <= k){
                return true;
            }else{
                hashtable.set(nums[i],i);
            }
        }
        hashtable.set(nums[i],i);
    }
    return false;
};

2,哈希算法--改进版

/**
 * @param {number[]} nums
 * @param {number} k
 * @return {boolean}
 */
var containsNearbyDuplicate = function(nums, k) {
    const hashtable = new Map();
    for(let i = 0;i<nums.length;i++){
        if(hashtable.has(nums[i]) && (i - hashtable.get(nums[i])) <= k){
            return true;
        }
        hashtable.set(nums[i],i)
    }
    return false;        
};

3,滑动窗口

第一次学习与运用该思想解决问题

/**
 * @param {number[]} nums
 * @param {number} k
 * @return {boolean}
 */
var containsNearbyDuplicate = function(nums, k) {
   const set = new Set();
   const len = nums.length;
   for(let i =0;i<len;i++){
    
       if(i>k){
           set.delete(nums[i-k-1]);
       }
       if(set.has( nums[i])){
           return true;
       }
       set.add(nums[i]);
   }
   return false;
};

3,学习与总结

3.1Map()函数补充

修改集合,集合有一个特性就是key不能重复,如果有重复的key,就会把之前的val覆盖掉

map.set(key,新的val)

3.2 Set()基础补充

集合(set)中的元素只会出现一次,即集合中的元素是唯一的;

const mySet1 = new Set();

mySet1.add(1); // Set(1) { 1 }
mySet1.add(5); // Set(2) { 1, 5 }
mySet1.add(5); // Set(2) { 1, 5 }
mySet1.add("some text"); // Set(3) { 1, 5, 'some text' }
const o = { a: 1, b: 2 };
mySet1.add(o);

mySet1.add({ a: 1, b: 2 }); // o 是不同对象的引用,所以这是可以的

mySet1.has(1); // true
mySet1.has(3); // false,因为并未将 3 添加到集合中
mySet1.has(5); // true
mySet1.has(Math.sqrt(25)); // true
mySet1.has("Some Text".toLowerCase()); // true
mySet1.has(o); // true

mySet1.size; // 5

mySet1.delete(5); // 从集合中移除 5
mySet1.has(5); // false,5 已从集合中移除

mySet1.size; // 4,因为我们刚刚移除了一个值

mySet1.add(5); // Set(5) { 1, 'some text', {...}, {...}, 5 }——先前删除的元素会作为新的元素被添加,不会保留删除前的原始位置

console.log(mySet1); // Set(5) { 1, "some text", {…}, {…}, 5 }

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值