力扣-hot100(最长连续序列 - Hash)

128. 最长连续序列

中等

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

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

示例 1:

复制代码
输入:nums = [100,4,200,1,3,2]
输出:4
解释:最长数字连续序列是 [1, 2, 3, 4]。它的长度为 4。
  • 0 <= nums.length <= 105

  • -109 <= nums[i] <= 109

第一想法,先预处理一波,可以创建一个数组把存在的数都标记一遍,如:nums = [100,4,200],标记:number[100] = 1, number[4] = 1, number[200] = 1; 然后从最小的数开始遍历到最后一个数,便可确定最大连续数了。但数据范围之大让我退去....(悲哀 为什么没看清题目再动手 白死八百个脑细胞 TOT)

解法一:

啧啧啧,要求O(n)的复杂度,每个数都只能被访问一次。那么我可以将数组中的分为 n 个组,毕竟组是相对有序的,比直接在乱七八糟的原数组里直接做要来的方便。那么要加入某个组的关键是什么?且看题目:【找出数字连续的最长序列】 有序!就是前后最近的元素只差1。一旦断了,那断的那个数你就自己做队长去招募你的队员吧。那该怎么维护一个组呢? 这里组最重要的就是连续数不能断,断了的话你就自己为队长。也就是我只要找到队长就能找到这个队伍所有的成员了。(心机之蛙一直摸你肚子 WOW) key -> 队长。众所周知,队长是开头的,前面是没有元素的。那么如果出现一样的元素怎么办?这样就可能有两个一样的元素带领同一队的元素,出现重复遍历。有没有这样一种数据结构会将重复出现的元素给打掉(如来佛祖与真假美猴王的场景正在攻击我OVO)。有的兄弟有的, Set 出来亮个相。我们只需要从队长开始不断的报数就可以统计该组的元素数量,然后求每个组的max就行了。

代码如下

复制代码
class Solution {
    public int longestConsecutive(int[] nums) {
        // 去重
        Set<Integer> set = new HashSet<>();
        for(int i : nums) set.add(i);
        // 定义元素最多组的数量
        int maxSize = 0;
​
        for(int i : set){
            // 判断该元素是不是连续数开头的那个元素(队长)
            // 如果是
            if(!set.contains(i - 1)){
                int CurrentNumber = i;
                int CurrentSize = 1;
                
                // 只要能找到队员就一直找下去
                while(set.contains(CurrentNumber + 1)){
                    CurrentNumber ++;
                    CurrentSize ++;
                }
                // 结束,进行队员数量结算
                maxSize = Math.max(maxSize, CurrentSize);
            }
        }
        return maxSize;
    }
}

时间复杂度 O(n)

执行代码时间 29ms 击败85.29%

解法二: 0 <= nums.length <= 105 , 那么 nlogn = 10^7 - 10^8 .只要低于10^9 过的概率还是大的。题目要求:时间复杂度为 O(n) 的算法解决此问题。不管辣 。排序完后硬做就很简单了~~~

复制代码
class Solution {
    public int longestConsecutive(int[] nums) {
        int len=nums.length;
        if(len==0){
            return 0;
        }
        if(len==1){
            return 1;
        }
        Arrays.sort(nums);
        int k=1;
        int max=1;
        for(int i=1;i<len;i++){
            if(nums[i]==nums[i-1])
                    continue;
            if(nums[i]-nums[i-1]==1){
                k++;
            max=Math.max(max,k);
            }else{
                k=1;
            }
        }
        return max;
    }
}
相关推荐
莫有杯子的龙潭峡谷12 分钟前
4.15 代码随想录第四十四天打卡
c++·算法
A懿轩A26 分钟前
2025年十六届蓝桥杯Python B组原题及代码解析
python·算法·蓝桥杯·idle·b组
灋✘逞_兇29 分钟前
快速幂+公共父节点
数据结构·c++·算法·leetcode
姜行运1 小时前
每日算法(双指针算法)(Day 1)
c++·算法·c#
stoneSkySpace1 小时前
算法——BFS
前端·javascript·算法
十五年专注C++开发1 小时前
面试题:请描述一下你在项目中是如何进行性能优化的?针对哪些方面进行了优化,采取了哪些具体的措施?
开发语言·数据结构·c++·qt·设计模式·性能优化
明月看潮生1 小时前
青少年编程与数学 02-016 Python数据结构与算法 20课题、几何算法
python·算法·青少年编程·编程与数学
wuqingshun3141592 小时前
经典算法 判断一个图是不是树
数据结构·c++·算法·蓝桥杯·深度优先
微臣愚钝2 小时前
图论-BFS搜索图/树-最短路径问题的解决
算法·图论·宽度优先
别来无恙2022 小时前
数据结构(4)
数据结构·c++