【Leetcode 每日一题 - 补卡】219. 存在重复元素 II

问题背景

给你一个整数数组 n u m s nums nums 和一个整数 k k k,判断数组中是否存在两个 不同的索引 i i i 和 j j j,满足 n u m s i = n u m s j numsi = numsj numsi=numsj 且 ∣ i − j ∣ < = k |i - j| <= k ∣i−j∣<=k。如果存在,返回 t r u e true true;否则,返回 f a l s e false false。

数据约束

  • 1 ≤ n u m s . l e n g t h ≤ 1 0 5 1 \le nums.length \le 10 ^ 5 1≤nums.length≤105
  • − 1 0 9 ≤ n u m s i ≤ 1 0 9 -10 ^ 9 \le numsi \le 10 ^ 9 −109≤numsi≤109
  • 0 ≤ k ≤ 1 0 5 0 \le k \le 10 ^ 5 0≤k≤105

解题过程

这题有两种思路,一是枚举右维护左,用哈希表来记录每个元素最后出现的位置,遇到新元素时,去哈希表中查出离当前位置最近的上一个位置,判断是否符合条件。

还可以从固定 k k k的角度出发,看作定长滑窗,同样定义一个哈希表,只要判断会不会出现窗口中存在重复元素的情况即可。

具体实现

枚举右维护左

java 复制代码
class Solution {
    public boolean containsNearbyDuplicate(int[] nums, int k) {
        Map<Integer, Integer> map = new HashMap<>();
        for (int i = 0; i < nums.length; i++) {
            int cur = nums[i];
            if (map.containsKey(cur) && i - map.get(cur) <= k) {
                return true;
            }
            map.put(cur, i);
        }
        return false;
    }
}

定长滑窗

java 复制代码
class Solution {
    public boolean containsNearbyDuplicate(int[] nums, int k) {
        Set<Integer> set = new HashSet<>();
        for (int i = 0; i < nums.length; i++) {
            if (!set.add(nums[i])) {
                return true;
            }
            if (i >= k) {
                set.remove(nums[i - k]);
            }
        }
        return false;
    }
}
相关推荐
2401_8414956414 分钟前
【操作系统】进程同步与互斥实验报告
c++·算法·操作系统·进程·并发·同步·互斥
爱刷碗的苏泓舒4 小时前
PPP-AR 中的参考星选取:数学原理、评价指标与切换处理
算法·gnss·模糊度固定·ppp-ar·星间单差·参考星·卫星端偏差
烬羽7 小时前
递归老写崩?一个"退回"公式,把回溯题变成填空题
javascript·深度学习·算法
闪电悠米7 小时前
力扣hot100-41.缺失的第一个正数-原地哈希详解
数据结构·算法·哈希算法
WL学习笔记8 小时前
堆(数据结构)
数据结构·
星空露珠8 小时前
28种颜色对应名称,
开发语言·数据库·算法·游戏·lua
QXWZ_IA9 小时前
桥梁数字孪生怎么落地?
人工智能·科技·算法·智能硬件·政务
Kel9 小时前
输出层与反分词(Output Layer & Detokenization)
人工智能·算法·架构
陕西企来客10 小时前
2026年7月技术好GEO优化方案:算法适配与内容策略
人工智能·算法·机器学习·技术好geo优化
风栖柳白杨10 小时前
【面试】AI算法工程师_空白自测版本
人工智能·算法·面试