Leetcode 存在重复元素II

这段代码的算法思想可以用以下步骤来解释:

算法思想

  1. 使用哈希表(HashMap)存储每个元素的索引

    • 遍历数组 nums 时,使用一个 HashMap 来记录每个元素的值和它的索引位置。这样可以快速查找之前出现过的相同元素的索引。
  2. 检查是否存在符合条件的重复元素

    • 对于数组中的每个元素 nums[i],如果 HashMap 中已经存在这个元素(即之前已经出现过相同的元素),我们就获取它之前的索引 j(即 map.get(nums[i]))。
    • 然后检查当前索引 i 和之前的索引 j 的距离是否小于或等于 k。如果满足条件 i - j <= k,就返回 true,表示找到了符合条件的重复元素。
  3. 更新哈希表

    • 如果 HashMap 中不存在当前元素,或者当前元素虽然存在,但它的索引不满足条件 i - j <= k,那么就更新 HashMap,将当前元素的索引 i 存储到 HashMap 中。这样可以确保 HashMap 中存储的是最近出现的该元素的索引位置。
  4. 遍历完成后返回 false

    • 如果遍历完整个数组都没有找到符合条件的重复元素,就返回 false

代码复杂度

  • 时间复杂度O(n),因为我们只需要遍历一遍数组,且每次在哈希表中查找、插入的时间复杂度都是常数 O(1)
  • 空间复杂度O(min(n, 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) {
            if(map.containsKey(nums[i])) {
                int j = map.get(nums[i]);
                if(i - j <= k) {
                    return true;
                }
            }
            map.put(nums[i], i);
        }
        return false;
    }
}
相关推荐
旖-旎1 小时前
《LeetCode 53 最大子数组和 || LeetCode 918 环形子数组的最大和》
c++·算法·leetcode·动态规划
变量未定义~1 小时前
单调栈+倍增思想 皇家守卫【算法赛】、单调队列 附近最小
算法
QN1幻化引擎1 小时前
给 AI 做一次「意识体检」——基于 QN1 幻化引擎的灵鉴意识识别框架与 DalinX V5 实测
大数据·数据结构·人工智能·算法·架构
拂拉氏1 小时前
【知识讲解】 AVL树从基本成员的介绍到核心接口的实现(插入、判断、删除等等)
数据结构·算法·avl树
可靠的仙人掌2 小时前
SAC(Soft Actor-Critic)算法底座
开发语言·算法·php
海石3 小时前
单调栈复健,顺便,牺牲一下吧,空间复杂度!一切献给AC
算法·leetcode
海石3 小时前
JS击败94%,Hard题想不到动态规划,那就用数组和栈试试
算法·leetcode
杨逢昌工厂6S管理5 小时前
28- 杨逢昌:制造企业仓储6S反复混乱解决方案——四维定置标准化管控体系,让物料混放、通道堵塞等重复性乱象减少90%
大数据·经验分享·笔记·职场和发展·制造·学习方法
alphaTao6 小时前
LeetCode 每日一题 2026/7/6-2026/7/12
算法·leetcode
想吃火锅10056 小时前
【leetcode】56.合并区间js
算法·leetcode·职场和发展