LeetCode219 存在重复元素 II
题目
解题
解题一:哈希表
题目问的为是否存在,即如果有重复元素,那么任意两个重复元素之前的索引差 <= k,就返回 true。
如果某个元素 A 出现在 i, j, k 三个位置,j - i > k,此时应该更新哈希表中 A 对应的索引,因为寻找的是不大于 k 的索引差,所以希望找到更小的索引差。比如:
nums = [1,0,1,1], k = 1
// javascript
var containsNearbyDuplicate = function(nums, k) {
const map = new Map();
for (let i = 0; i < nums.length; ++i) {
if (map.has(nums[i]) === true) {
if (i - map.get(nums[i]) <= k) {
return true;
}
}
// 哪怕有记录也要更新为当前索引值,因为希望找到更小的索引差
map.set(nums[i], i);
}
return false;
};
解题二:哈希集合维护滑动窗口
// javascript
var containsNearbyDuplicate = function(nums, k) {
const n = nums.length;
const set = new Set();
for (let i = 0; i < n; ++i) {
// 维护的是一个大小不超过 k 的散列表(无重复元素)
// 如果 set 里有元素与之相等的元素,索引差值必定不大于 k
if (set.has(nums[i])) {
return true;
}
// 如果没有则加入
set.add(nums[i]);
// 加入后如果使得大小超过 k,那么将滑动窗口内第一个元素删除
if (set.size > k) {
set.delete(nums[i - k]);
}
}
return false;
};