跳过正文

19 日 No.539 最小时间差

·564 字·2 分钟
曙光磁铁
作者
曙光磁铁

原贴地址:https://dawnmagnet.github.io/algorithm-station/docs/2022/1/18

给你一个整数数组 nums 和一个整数 k ,判断数组中是否存在两个 不同的索引 ij ,满足 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 <= 10^5
  • -10^9 <= nums[i] <= 10^9
  • 0 <= k <= 10^5

来源:力扣(LeetCode) 链接:https://leetcode-cn.com/problems/contains-duplicate-ii 著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

思路分析
#

本题用一个通俗易懂的话讲解一下,就是在一个数组中找出下标相距小于一个特定值的两个相同值。而如何更高效地判断呢?

我们可以使用滑动窗口高效的解决这一个题目,因为按照题目要求,可能配对的两个值一定是在总长度为k+1的下标区间中,所以我们可以维护一个长度为k+1的滑动窗口,另外使用一个哈希表来判断是否有重复的值,从而只在这个区间内判断是否存在合法的答案

Rust 代码
#

impl Solution {
    pub fn contains_nearby_duplicate(mut nums: Vec<i32>, k: i32) -> bool {
        let k = k as usize;
        let mut map = std::collections::HashMap::new();
        for i in 0..nums.len() {
            if i > k {
                *map.entry(nums[i - k - 1]).or_insert(0) -= 1;
            }
            *map.entry(nums[i]).or_insert(0) += 1;
            if *map.entry(nums[i]).or_insert(0) > 1 {
                return true;
            }

        }
        return false;
    }
}