leetcode

简单数组哈希表滑动窗口

方法1 暴力解法

  1. var containsNearbyDuplicate = function(nums, k) {
  2. const len = nums.length;
  3. for(let i = 0; i < len; i++) {
  4. const item = nums[i];
  5. for(let j = i + 1; j < len; j++) {
  6. if (item === nums[j] && j - i <= k) return true;
  7. }
  8. }
  9. return false;
  10. };

image.png

219. 存在重复元素 II - 图2

方法2 哈希表

  1. var containsNearbyDuplicate = function(nums, k) {
  2. const map = new Map();
  3. for(let i = 0; i < nums.length; i++) {
  4. const item = nums[i];
  5. if (map.has(item) && i - map.get(item) <= k) return true;
  6. map.set(item, i);
  7. }
  8. return false;
  9. };

image.png

219. 存在重复元素 II - 图4

核心逻辑:一旦出现重复项,只要从前边扫过的项中找与自身距离最近的重复项进行比较,判断两者之间的距离是否满足要求即可。

如果出现重复的 key,也就是出现了重复的成员。
并且此时出现的这个重复的成员不满足条件,那么直接使用该成员覆盖 map 中原有的成员即可。
这么做是合理的,因为与下一个重复成员更近的是当前出现的这个重复成员,下面举例说明
nums: [1, 2, 3, 1, 4, 1]
k:2

  1. {
  2. "1": 0,
  3. "2": 1,
  4. "3": 2,
  5. }

219. 存在重复元素 II - 图5

方法3 滑动窗口

  1. var containsNearbyDuplicate = function (nums, k) {
  2. const set = new Set();
  3. for (let i = 0; i < nums.length; i++) {
  4. const item = nums[i];
  5. if (i >= k + 1) set.delete(nums[i - k - 1]); // 收缩窗口
  6. if (set.has(item)) return true;
  7. set.add(item); // 扩展窗口
  8. }
  9. return false;
  10. };

image.png

⚠️ 顺序

  1. 收缩窗口
  2. 判断重复成员
  3. 扩展窗口

219. 存在重复元素 II - 图7