存在重复元素 II

存在重复元素 II

CategoryDifficultyLikesDislikes
algorithmsEasy (44.26%)610-
Tags

array | hash-table

Companies

airbnb | palantir

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

示例 1:

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

示例 2:

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

示例 3:

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

提示:

  • 1 <= nums.length <= 10<sup>5</sup>
  • -10<sup>9</sup> <= nums[i] <= 10<sup>9</sup>
  • 0 <= k <= 10<sup>5</sup>

Discussion | Solution

解法

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
// @lc code=start
impl Solution {
    /// ## 解题思路
    /// - hashset + 滑动窗口
    /// 1. 设置set滑窗;
    /// 2. 从左至右遍历nums[i];
    /// 3. 如果i > k, 则缩小set 窗口最左边的元素;
    /// 4. 如果nums[i]在滑窗中, 则返回true;
    /// 5. 否则将nums[i]加入到滑窗中;
    /// 6. 遍历玩后, 没有触发4, 则返回false;
    pub fn contains_nearby_duplicate(nums: Vec<i32>, k: i32) -> bool {
        if nums.len() == 0 || k == 0 {
            return false;
        }
        let k = k as usize;
        use std::collections::HashSet;
        let mut tmp_win: HashSet<i32> = HashSet::with_capacity(k);
        for (i, &n) in nums.iter().enumerate() {
            if i > k {
                tmp_win.remove(&nums[i - k - 1]);
            }
            if tmp_win.contains(&n) {
                return true;
            }
            tmp_win.insert(n);
        }

        return false;
    }
}
// @lc code=end

struct Solution;
updatedupdated2024-08-252024-08-25