给定一个未排序的整数数组 nums
,找出数字连续的最长序列(不要求序列元素在原数组中连续)的长度。
请你设计并实现时间复杂度为 O(n)
的算法解决此问题。
思路:先创建一个set ,将数组去重
遍历数组,如果当前数 n 有n-1存在在set中 就跳过,不存在,就继续,从当前数开始遍历,检查n + 1是否存在set中,存在,就更新当前数和当前长度,不存在就跳出循环 取最大长度值
注意:本题要求是O(n)的时间复杂度 如何理解:
外层循环是遍历sets里面的值 可是却还有一个while内循环,按理说应该是O(n^2)了
可是这里确是符合题目要求 能ac的
原因在与:while里面,每次找的都是是否有相邻的下一个数,一旦有,就跳出循环,
这里就排除了重复遍历,因为例如 [1,2,3,4] 1已经遍历了一遍 最长是4,到2时,
由于有3,那么这一段遍历就已经被包含在1的遍历中了,就直接跳过,3,4也是如此,
所以,就相当于只遍历了O(n),并没有n^2
var longestConsecutive = function (nums) {
let sets = new Set()
for (const num of nums) {
sets.add(num) // 去重nums 创建set
}
let longest = 0 // 初始化最长数
for (const num of sets){ // 遍历sets
if(!sets.has(num - 1)){ // 如果没有num - 1就继续
let currentNum = num // 设置当前数
let current = 1 // 设置当前长度
while(sets.has(currentNum + 1)){
// 开始当前数遍历 如果存在 n + 1 那么就更新当前数和当前长度 都加一
current += 1
currentNum += 1
}
longest = Math.max(longest,current) // 取最大值
}
}
return longest
}