003 --- 最长连续序列 --- 力扣热题100题

给定一个未排序的整数数组 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
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值