当前位置: 首页 > article >正文

【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 ] nums[i] = nums[j] nums[i]=nums[j] ∣ i − j ∣ < = k |i - j| <= k ij<=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 1nums.length105
  • − 1 0 9 ≤ n u m s [ i ] ≤ 1 0 9 -10 ^ 9 \le nums[i] \le 10 ^ 9 109nums[i]109
  • 0 ≤ k ≤ 1 0 5 0 \le k \le 10 ^ 5 0k105

解题过程

这题有两种思路,一是枚举右维护左,用哈希表来记录每个元素最后出现的位置,遇到新元素时,去哈希表中查出离当前位置最近的上一个位置,判断是否符合条件。
还可以从固定 k k k的角度出发,看作定长滑窗,同样定义一个哈希表,只要判断会不会出现窗口中存在重复元素的情况即可。

具体实现

枚举右维护左

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;
    }
}

定长滑窗

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;
    }
}

http://www.kler.cn/a/526629.html

相关文章:

  • 代码随想录算法训练营第三十九天-动态规划-337. 打家劫舍 III
  • MATLAB中extractAfter函数用法
  • C语言练习(31)
  • 01-时间与管理
  • 【新春特辑】2025年1月科技浪潮中的AI最新时事与科技趋势
  • 1.Template Method 模式
  • Python 变量和简单数据类型(Python之禅)
  • Leetcode:350
  • 基于SpringBoot 前端接收中文显示解决方案
  • Autosar-Os是怎么运行的?(内存保护)
  • Leetcode 40. 组合总和 II
  • 我的AI工具箱Tauri+Django内容生产介绍和使用
  • Day28(补)-【AI思考】-AI会不会考虑自己的需求?
  • MathType下载与安装详细教程
  • Attention--人工智能领域的核心技术
  • PostgreSQL 插入、选择、更新、删除数据
  • Python | Pytorch | 什么是 Inplace Operation(就地操作)?
  • 前端开发之jsencrypt加密解密的使用方法和使用示例
  • 【以音频软件FFmpeg为例】通过Python脚本将软件路径添加到Windows系统环境变量中的实现与原理分析
  • nodeJS 系统学习-章节3-文件系统
  • vue3的路由配置
  • AI常见的算法和例子
  • IP服务模型
  • LeetCode - #194 Swift 实现文件内容转置
  • Java基础知识总结(三十二)--API--- java.lang.Runtime
  • 【算法设计与分析】实验2:递归与分治—Hanoi塔、棋盘覆盖、最大子段和