• 算法萌新闯力扣:存在重复元素II


        力扣题:存在重复元素II

    开篇

      这道题是217.存在重复元素的升级版,难度稍微提高。通过这道题,能加强对哈希表和滑动窗口的运用。

    题目链接:219.存在重复元素II

    题目描述

    在这里插入图片描述

    代码思路

    1.利用哈希表,来保存数组元素及其索引位置
    2.遍历所有数组元素,如果哈希表之前保存过该元素,则判断两者的索引值之差是否符合题目要求,符合则返回true。
    3.每次遍历都要更新哈希表,把该数组元素和对应的索引值放入哈希表,即使是保存过的元素,也必须更新掉

    代码纯享版

    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])){
                    if(i - map.get(nums[i]) <= k)return true;
                }
                map.put(nums[i], i);
            }
            return false;
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12

    代码逐行解析版

    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])){ //如果哈希表中存有该数组元素
                    if(i - map.get(nums[i]) <= k)return true;//判断i和之前保存的索引值之差是否小于等于k
                }
                map.put(nums[i], i); //只要循环继续,就会执行这一步,就算哈希表之前有保存与nums[i]相同的键,此时也会更新
            }
            return false; //循环中没找到题目要求的重复元素,返回false
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12

    其它解法

    利用哈希表来维护一个滑动窗口,滑动窗口长度大于k,就移去最前面的元素

    class Solution {
        public boolean containsNearbyDuplicate(int[] nums, int k) {
            HashSet<Integer> set = new HashSet<>();
            for(int i = 0; i < nums.length; i++) {
                if(set.contains(nums[i])) {
                    return true;
                }
                set.add(nums[i]);
                if(set.size() > k) {
                    set.remove(nums[i - k]);
                }
            }
            return false;
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15

    再改进:代码中

    if(set.contains(nums[i])) {
           return true;
     }
           set.add(nums[i]);
    
    • 1
    • 2
    • 3
    • 4

    改成

     if(!set.add(nums[i])){
            return true;
      }
    
    • 1
    • 2
    • 3

    结语

     如果这篇文章对你理解这道题有所帮助,点个关注支持一下。我会每天更新力扣题的解析,与大家一起进步。

  • 相关阅读:
    WPF数据绑定(Binding的源与路径)(二)
    双层循环和循环语句
    【windows】实战部署二(使用)SVNserver服务端+SVNclient客户端
    java大学生运动会管理系统springboot+vue+ElementUI
    leetcode top100(10) 和为 K 的子数组
    数据结构:顺序栈和链式栈的实现
    python(自5)scrapy下载安装 基本使用
    Chapter0.3:矩阵代数初步
    Qt之进程通信-QProcess(含源码+注释)
    Redis缓存数据库-快速入门
  • 原文地址:https://blog.csdn.net/m0_73709096/article/details/134420548