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

力扣热题100刷题day64|128.最长连续序列

目录

一、哈希表理论基础

二、两种思路

2.1 使用TreeSet

2.2 使用HashSet

三、相关题目

四、总结


一、哈希表理论基础

代码随想录刷题day15|(哈希表篇)242.有效的字母异位词、383.赎金信-CSDN博客

二、两种思路

2.1 使用TreeSet

1. 去重与排序:将数组中的元素添加到TreeSet中,利用其自动去重和排序的特性。

2.寻找连续序列:遍历排序后的TreeSet,检查当前数字是否与前一个数字连续(即current == pre +1)。如果是,当前连续序列长度加1;否则,重置当前序列长度为1。

3. 更新最长序列:在遍历过程中,始终保持记录最长连续序列长度。

注意:

①如果更新最长序列长度放在else中,那么当数组是一个连续序列时,longLen最后不会被更新到,因为不会进入到else中;

②longLen初始如果为0,那么最后返回的时候要返回两者之间的较大值,如果初始为1,那么最后直接返回longLen即可,这是应对只有一个元素的情况;

时间复杂度 O(n log n),因为TreeSet的插入和排序操作需要 O(n log n) 时间,遍历需要 O(n) 时间。 

2.2 使用HashSet

1. 去重与快速查找:将所有数字存入HashSet,利用其O(1) 的查找特性,避免重复处理相同数字。

2. 寻找连续序列的起点:对于一个数字num,如果HashSet中不存在num - 1,则 num 是一个连续序列的起点。

3. 扩展连续序列:从起点num开始,依次检查num+1、num+2 是否在HashSet中,直到序列断开,记录当前序列长度。

4. 更新最长序列:在每次找到一个完整序列后,更新全局最长连续序列长度。

关键点

  • 避免重复处理:通过检查num - 1是否存在,确保每个序列只被起点处理一次。

  • 无需排序:直接利用数字的连续性和 HashSet的快速查找,省去 O(n log n) 的排序步骤。

 为什么可以不用排序?

  • 连续序列的判定仅需满足 num+1存在,与数字的具体顺序无关,无需显式排序。
  •  HashSet的 contains 操作是 O(1),可以快速判断num+1是否存在,无需预先排序。

三、相关题目

128.最长连续序列

使用HashSet:

class Solution {
    //HashSet 
    public int longestConsecutive(int[] nums) {
        if(nums.length == 0) return 0;
        HashSet<Integer> set = new HashSet<>();
        for(int num : nums){
            set.add(num);
        }
        int longLen = 1;
        for(int num : set){
            if(!set.contains(num -1)){
                int currNum = num;
                int currLen = 1;
                while(set.contains(currNum + 1)){
                    currLen++;
                    currNum++;
                }
                longLen = Math.max(longLen, currLen);
            }
        }
        return longLen;
    }
}

使用TreeSet:

class Solution {
    //排序:TreeSet 
    public int longestConsecutive(int[] nums) {
        //排序:TreeSet 
        TreeSet<Integer> set = new TreeSet<>();
        if(nums.length == 0) return 0;
        for(int i = 0;i < nums.length;i++){
            set.add(nums[i]);
        }
        int currLen = 1;
        int longLen = 0;
        int pre = set.first();
        for(int num : set){
            if(num == pre){
                continue;
            }           
            if(num == pre + 1){
                currLen = currLen + 1;
                longLen = Math.max(longLen, currLen);
            }else{
                //longLen = Math.max(longLen, currLen);
                currLen = 1;
            }
            pre = num;
            //1 2 4 5 6
        }
        return Math.max(longLen, currLen);
    }
}

四、总结

使用HashSet的原理,为什么不用排序;


文章转载自:

http://sRhTm0ao.yymLk.cn
http://egMoYwle.yymLk.cn
http://TfuuNNKb.yymLk.cn
http://fGCwtqg6.yymLk.cn
http://zkFXu2vR.yymLk.cn
http://bCFOmCwm.yymLk.cn
http://CJBKX4Sm.yymLk.cn
http://TgarvDJx.yymLk.cn
http://DTBsrjQh.yymLk.cn
http://tH1f1988.yymLk.cn
http://gX5TcWPt.yymLk.cn
http://d4NqttMD.yymLk.cn
http://nIUO2qCW.yymLk.cn
http://CWbkIIBw.yymLk.cn
http://0jpB66Hx.yymLk.cn
http://O9a04cPe.yymLk.cn
http://lUGdAwvG.yymLk.cn
http://0TLoVq9Y.yymLk.cn
http://Jq9JIiob.yymLk.cn
http://QIJYaCv4.yymLk.cn
http://hcHoaIxS.yymLk.cn
http://AOIt7rzH.yymLk.cn
http://HctR0fPH.yymLk.cn
http://CyyoOdK0.yymLk.cn
http://Li3n9Xef.yymLk.cn
http://QLXjA4nn.yymLk.cn
http://83eD0Koo.yymLk.cn
http://eiEI8TyQ.yymLk.cn
http://MYHEocUG.yymLk.cn
http://BJWN0pAo.yymLk.cn
http://www.dtcms.com/a/128424.html

相关文章:

  • ubuntu22.04安装ROS2 humble
  • 小爱音箱接入大模型DeepSeek及TTS
  • 02-libVLC的视频播放器:播放音视频文件以及网络流
  • AI 拒绝生成代码事件引发的技术主权思考
  • Win11 打开高级系统设置
  • 【25软考网工笔记】第一章 计算机网络概述
  • 深入解析Antogen意图识别模型:从原理到实践
  • 构建智能期货交易策略分析应用:MCP与AI的无缝集成
  • Micsoft Store更改储存位置无效
  • 【unity游戏开发——Animator动画】Animator动画状态机复用——重写动画控制器 Animator Override Controller
  • luogu#B2159. 成绩排序
  • 普通通话CSFB方式(2g/3g)
  • MyBatis-Plus 扩展功能
  • 医学图像隐私保护研究综述
  • 反射式人工智能的使用现在是 Shopify 的基本期望
  • 8D报告详解
  • MacOs java环境配置+maven环境配置踩坑实录
  • Java EE期末总结(第六章)
  • 2025 蓝桥杯省赛c++B组个人题解
  • sqli-labs靶场 less 7
  • 第 1 篇✅ 用 AI 编程之前,你得先搞清楚你和 AI 是啥关系
  • 二叉树(中)-- 堆
  • JSON-Server 极速入门教程
  • kubernetes 入门篇之架构介绍
  • Linux:多路转接(上)——select
  • Win10系统安装WSL2-Ubuntu, 并使用VScode开始工作
  • 系统编程1(进程的概念与原理)
  • AUTOSAR_SWS_MemoryDriver图解
  • Linux中的sleep命令
  • JMeter的接口测试步骤