持续创作,加速成长!这是我参与「掘金日新计划 · 10 月更文挑战」的第9天,点击查看活动详情
1.题目
给定一个未排序的整数数组 nums ,找出数字连续的最长序列(不要求序列元素在原数组中连续)的长度。
请你设计并实现时间复杂度为 O(n) 的算法解决此问题。
示例 1:
输入:nums = [100,4,200,1,3,2]
输出:4
解释:最长数字连续序列是 [1, 2, 3, 4]。它的长度为 4。
2.思路
本题需要我们找到数字连续的最长序列并且不要求在原数组中连续,简单的办法就是我们直接对数组进行排序,然后在遍历一遍找到最长的连续数字。但是题目要求我们实现时间复杂度为O(n)的算法,所以我们不能直接使用排序方法来处理,因为首先我们从数组中找到数字就需要遍历一遍数组,所以我们可以通过一些其他办法来解决这个问题。
我们可以采用哈希表的方式来保存数组中的数字,这样我们在查找数字时就直接找到,不需要花费对数组遍历的时间,然后我们可以通过一个循环来判断这个数字有没有后续数字,然后再收集这个数字本次循环结束时长度为多少,再将长度返回。
首先我们循环遍历一遍数组,将数组中的内容放入set对象中,可以完成结构转换和去重的两个效果,然后再对set对象进行遍历,判断每一个数字是否存在比该数字小1的数字,因为如果存在比该数字小1的数字,那么小1的数字的连续序列长度一定大于该数字,所以可以直接跳过节约时间。如果没有就开始进行内循环,首先设置循环跳出条件为找不到该数字的后续连续数字了,同时新建变量用以保存当前长度以及当前数字值,满足循环条件时就将两个变量加1,当跳出循环时则与外层保存的长度变量比较并更新为更大的值。
3.代码
var longestConsecutive = function(nums) {
let numsSet = new Set()
nums.forEach(item=>{
numsSet.add(item)
})
let longLen = 0
numsSet.forEach(item=>{
if(!numsSet.has(item-1)){
let cur = 1
let curVal = item
while(numsSet.has(curVal+1)){
curVal+=1
cur+=1
}
longLen = longLen<cur?cur:longLen
}
})
return longLen
};