数据结构论坛

首页 » 分类 » 分类 » 图解LeetCode128最长连续
TUhjnbcbe - 2025/1/9 21:04:00
白癜风医院有哪些 https://jbk.39.net/yiyuanfengcai/zn_bjzkbdfyy/
一、题目

给定一个未排序的整数数组nums,找出数字连续的最长序列(不要求序列元素在原数组中连续)的长度。请你设计并实现时间复杂度为O(n)的算法解决此问题。

二、示例2.1示例1:

nums=[,4,,1,,2]4最长数字连续序列是[1,2,,4]。它的长度为4。

2.2示例2:

nums=[0,,7,2,5,8,4,6,0,1]9

提示:

0=nums.length=10^5

-10^9=nums=10^9

三、解题思路

根据本题的描述,一般来说,最容易想到的就是先将nums进行排序,然后再从排序后的数组头部开始遍历,如果存在nums+1,则进行加1计数。只要不存在nums+1,则从0开始重新执行计数操作。那么,每当发生了“断点”,则通过result=Math.max(result,count)来更新result值(result表示最长数字连续序列个数)。

但是由于本题目要求实现时间复杂度为O(n)的算法解决此问题,那么排序的做法我们就无法实现了。那么,我们还有什么别的方法来解决这道题吗?我们可以创建一个Set数据结构的变量set,然后过滤掉nums数组中的重复元素。然后我们通过遍历数组nums,执行如下逻辑:

如果nums+1在set中存在,则表示nums不是连续序列的最大值,那么我们继续向下遍历,不用做任何操作;如果nums+1在set中不存在,则表示nums是连续序列的最大值,那么我们执行倒序查找set中的元素,即:依次寻找nums--的元素,并进行计数操作。

通过以上的操作,我们本质上就是去寻找连续序列的最大值,然后倒序寻找连续元素。对于非最大值,我们也不用处理,这样就可以加快查找速度了。当然,每次寻找完连续序列之后,再通过result=Math.max(result,count)来更新result值,那么最终结果就是本题要求的——最长数字连续序列长度了。

以上就是本题的解题思路了,还是按照惯例,我们以nums=[,4,,1,,2]为例,看一下具体的处理流程。请见下图所示:

四、代码实现

classSolution{publicintlongestConsecutive(int[]nums){intresult=0;SetIntegerset=newHashSet();for(intnum:nums)set.add(num);for(intnum:nums){if(!set.contains(num+1)){intmax=0;while(set.contains(num--))max++;result=Math.max(result,max);}}returnresult;}}

今天的文章内容就这些了:

写作不易,笔者几个小时甚至数天完成的一篇文章,只愿换来您几秒钟的点赞分享。

更多技术干货,欢迎大家

1
查看完整版本: 图解LeetCode128最长连续