「前端刷题」219.存在重复元素 II(EASY)

84 阅读1分钟

携手创作,共同成长!这是我参与「掘金日新计划 · 8 月更文挑战」的第18天,点击查看活动详情

题目(Contains Duplicate II)

链接:https://leetcode-cn.com/problems/contains-duplicate-ii
解决数:1596
通过率:44.4%
标签:数组 哈希表 滑动窗口 
相关公司:facebook google amazon 

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

 

示例 1:

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

示例 2:

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

示例 3:

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

 

 

提示:

  • 1 <= nums.length <= 105
  • -109 <= nums[i] <= 109
  • 0 <= k <= 105

思路

  • 维护一个哈希表,里面始终最多包含 k 个元素,当出现重复值时则说明在 k 距离内存在重复元素
  • 每次遍历一个元素则将其加入哈希表中,如果哈希表的大小大于 k,则移除最前面的数字
  • 时间复杂度:O(n)O(n)nn 为数组长度

代码

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

用 Set 结构保存最大 k 个数,超过 k 个数,删除最早存进来的数, 一旦发现即将存入的数在 Set 中有相等的值,直接结束遍历,返回 true

var containsNearbyDuplicate = function(nums, k) {
  let hash = new Set(), ans = false;
  
  for (let i = 0, n = nums.length; i < n; i++) {
    if (hash.has( nums[i] )) {
      ans = true;
      break;
    }
    hash.add( nums[i] );
    if (hash.size > k) {
      hash.delete( nums[i - k] );
    }
  }
  
  return ans;
}

维护一个长度为k+1的集合作为窗口,判断是否出现重复,元素个数满了的话弹出k+1个前的数字

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