目录
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 }