力扣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);
}
相关推荐
大阳1239 分钟前
线程(基本概念和相关命令)
开发语言·数据结构·经验分享·算法·线程·学习经验
Swift社区31 分钟前
Swift 实战:实现一个简化版的 Twitter(LeetCode 355)
leetcode·swift·twitter
weixin_307779131 小时前
VS Code配置MinGW64编译GNU 科学库 (GSL)
开发语言·c++·vscode·算法
学行库小秘2 小时前
ANN神经网络回归预测模型
人工智能·python·深度学习·神经网络·算法·机器学习·回归
没落之殇2 小时前
基于C语言实现的HRV分析方法 —— 与Kubios和MATLAB对比
算法
秋难降2 小时前
线段树的深度解析(最长递增子序列类解题步骤)
数据结构·python·算法
楚韵天工3 小时前
基于GIS的无人机模拟飞行控制系统设计与实现
深度学习·算法·深度优先·无人机·广度优先·迭代加深·图搜索算法
你也向往长安城吗4 小时前
推荐一个三维导航库:three-pathfinding-3d
javascript·算法
百度智能云4 小时前
VectorDB+FastGPT一站式构建:智能知识库与企业级对话系统实战
算法
AI小白的Python之路5 小时前
数据结构与算法-排序
数据结构·算法·排序算法