力扣100题之128. 最长连续序列

方法1 使用了hash

方法思路

使用哈希集合:首先将数组中的所有数字存入一个哈希集合中,这样可以在 O(1) 时间内检查某个数字是否存在。

寻找连续序列:遍历数组中的每一个数字,对于每一个数字,

检查它是否是某个连续序列的起点(即检查 num - 1 是否存在于集合中)。

如果不是起点,则跳过;

如果是起点,则开始向后检查连续的数字(num + 1, num + 2 等),并记录序列的长度。

更新最大长度:在遍历过程中,不断更新记录的最大序列长度。

这种方法确保每个数字最多被访问两次(一次在遍历数组时,一次在检查连续序列时),因此时间复杂度为 O(n)。

java 复制代码
    public int longestConsecutive(int[] nums) {

      /*  方法思路
        使用哈希集合:首先将数组中的所有数字存入一个哈希集合中,这样可以在 O(1) 时间内检查某个数字是否存在。
        寻找连续序列:遍历数组中的每一个数字,对于每一个数字,
        检查它是否是某个连续序列的起点(即检查 num - 1 是否存在于集合中)。
        如果不是起点,则跳过;
        如果是起点,则开始向后检查连续的数字(num + 1, num + 2 等),并记录序列的长度。
        更新最大长度:在遍历过程中,不断更新记录的最大序列长度。
        这种方法确保每个数字最多被访问两次(一次在遍历数组时,一次在检查连续序列时),因此时间复杂度为 O(n)。*/
        
//        1.哈希集合初始化:将数组中的所有数字存入哈希集合 numSet 中,以便快速查找。
            Set<Integer> hashSet = new HashSet<>;
            for(int num:nums){
                hashSet.add(num);
            }
            int longesetStreak = 0;
//        2.遍历集合:对于集合中的每一个数字,检查它是否是某个连续序列的起点(即 num - 1 不在集合中)。
                for(int num:hashSet){
                    //        3.扩展序列:如果是起点,则向后扩展序列,计算当前连续序列的长度 currentStreak。
                    if(!hashSet.contains(num-1)){
                        int currentNum =num;
                        int currentStreak=1;
                        while(hashSet.contains(currentNum+1)){
                            currentNum++;
                            currentStreak++;
                        }
                        //        4.更新最大值:比较并更新最长序列长度 longestStreak。
                        longesetStreak=Math.max(longesetStreak,currentStreak);
                    }
                }


//        5.返回结果:最终返回最长序列的长度。
            return longesetStreak;
    }
        

方法二 排序法(时间复杂度大)

java 复制代码
public int longestConsecutive(int[] nums) {
    // 处理边界情况:空数组直接返回0
    if (nums.length == 0) return 0;
    
    // 对数组排序(升序),便于后续连续元素判断
    Arrays.sort(nums);
    
    int maxLength = 0;  // 记录最长连续子序列长度
    int currentLength = 1;  // 当前连续子序列长度,初始为1(至少有一个元素)
    
    // 从第二个元素开始遍历(索引1到末尾)
    for (int i = 1; i < nums.length; i++) {
        int currentNum = nums[i];
        int prevNum = nums[i - 1];
        
        if (currentNum == prevNum) {
            // 跳过重复元素(排序后相邻重复,不影响连续性判断)
            continue;
        } else if (currentNum == prevNum + 1) {
            // 当前元素与前一个元素连续,长度加1
            currentLength++;
        } else {
            // 连续序列中断,更新最长长度,并重置当前长度
            maxLength = Math.max(maxLength, currentLength);
            currentLength = 1;
        }
    }
    
    // 处理最后一次连续序列(遍历结束后可能还有未比较的长度)
    return Math.max(maxLength, currentLength);
}
相关推荐
学计算机的计算基6 分钟前
回溯算法下篇:四道经典题讲透约束剪枝、原地标记、预计算与状态压缩
java·笔记·算法
霸道流氓气质33 分钟前
SpringBoot中实现告警判定算法-位报警与模拟量阈值-技术详解
spring boot·算法·jquery
行者全栈架构师36 分钟前
混元 Hy3 Agent 实战:季度报告 3 小时变 40 分钟
算法·架构·代码规范
兰令水1 小时前
hot100【acm版】【2026.7.21打卡-java版本】
java·开发语言·算法·leetcode·面试
好好沉淀1 小时前
主键选择(自增 vs UUID vs 雪花算法)
java·算法
退休倒计时2 小时前
【每日一题】LeetCode 131. 分割回文串 TypeScript
算法·leetcode·typescript
小白说大模型2 小时前
AI Agent 调试实战:链路追踪、Prompt 可视化与异常定位的系统方法
java·人工智能·python·算法·prompt
梅梅绵绵冰2 小时前
算法题-矩阵
数据结构·算法·矩阵
atunet2 小时前
关于从哈希冲突看缓存设计的实践与权衡7
算法
GuWenyue11 小时前
传统Agent工具两大痛点!300行代码落地MCP跨语言工具,彻底解耦LLM与工具
前端·人工智能·算法