leetcode算法热题--最长连续序列

题目

给定一个未排序的整数数组 nums ,找出数字连续的最长序列(不要求序列元素在原数组中连续)的长度。

请你设计并实现时间复杂度为 O(n) 的算法解决此问题。
示例 1:

输入:nums = [100,4,200,1,3,2]
输出:4
解释:最长数字连续序列是 [1, 2, 3, 4]。它的长度为 4。

示例 2:

输入:nums = [0,3,7,2,5,8,4,6,0,1]
输出:9

提示:

0 <= nums.length <= 10^5
-10^9 <= nums[i] <= 10^9

题目链接 :https://leetcode.cn/problems/longest-consecutive-sequence/?envType=study-plan-v2&envId=top-100-liked

解答

思路和算法
我们能想到的最简单的方法就是排序,排序之后循环找出最长子序列即可了。但是要保证时间复杂度为O(n),一般的排序都不能满足,我们可以使用哈希表来解决这个问题,因为哈希表查找的时间复杂度为O(1),所有我们先将数组中的值全部存入哈希表中,随后我们就遍历哈希表,同时计算以当前数向后的最长子序列为多少,当然,如果当前数的前驱数有的话我们就能跳过这个数,因为在它的前驱数就已经计算过最长序列了。

代码
class Solution {
public:
    int longestConsecutive(vector<int>& nums) {
        unordered_set<int> hash;
        //将nums数组元素存入哈希表
        for(auto num : nums)
        {
            hash.insert(num);
        }
        //最长序列初始化为0
        int res = 0;
        //遍历哈希表
        for(auto num : hash)
        {
            //判断前驱数
            if (!hash.count(num - 1))
            {
                int currentnum = num;
                int tmp = 1;
                //寻找以num为起点的最长序列
                while(hash.count(currentnum+1))
                {
                    currentnum+=1;
                    tmp+=1;
                }
                //选择最长序列
                res=max(tmp,res);
            }
        }
    return res;
    }
};
复杂度分析

时间复杂度:O(n),其中 n 为数组的长度。只有当一个数是连续序列的第一个数的情况下才会进入内层循环,然后在内层循环中匹配连续序列中的数,因此数组中的每个数只会进入内层循环一次。
空间复杂度:O(n),哈希表存储数组中所有的数需要 O(n)的空间。

posted @   oyoyoy  阅读(39)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 【.NET】调用本地 Deepseek 模型
· CSnakes vs Python.NET:高效嵌入与灵活互通的跨语言方案对比
· 我与微信审核的“相爱相杀”看个人小程序副业
· DeepSeek “源神”启动!「GitHub 热点速览」
· Plotly.NET 一个为 .NET 打造的强大开源交互式图表库
点击右上角即可分享
微信分享提示