128-最长连续序列(算法思路,优化和复杂度分析)

题目描述

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

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

示例 1:

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

示例 2:

ini 复制代码
输入:nums = [0,3,7,2,5,8,4,6,0,1]
输出:9

思路

首先将数组元素都添加到set中,借助set高效的查找

再对数组元素进行遍历,找到连续序列的起点或终点,这样可以减少不必要的操作,因为从起点(连续序列中的最小数字)向上遍历或者从终点向下遍历能确定当前连续序列的最大长度

复杂度分析

时间复杂度

1. 创建 Set

  • 操作 :遍历数组 nums 并将每个元素添加到 Set 中。
  • 时间复杂度 :O(N),其中 N 是数组 nums 的长度。

2. 遍历 Set 并查找最长连续序列

  • 外层循环 :遍历 Set 中的每个元素,时间复杂度为 O(N)。
  • 内层循环
    • 只有在当前数字 n 是某个序列的起始点(即 n - 1 不在 Set 中)时,才会进入内层 while 循环。
    • 每个数字最多只会被访问一次,无论是作为外层循环的一部分还是在内层循环中被递增处理。
    • 因此,内层循环总的操作次数不会超过 N 次。
  • 总时间复杂度
    • 外层循环:O(N)
    • 内层循环:O(N)(由于每个数字最多被处理一次)
    • 综合总时间复杂度:O(N) + O(N) = O(N)

空间复杂度

  • Set :存储了数组 nums 中的所有唯一元素,空间复杂度为 O(N)。
  • 其他变量
    • maxLencurLen:常数空间,O(1)。
  • 总空间复杂度O(N)

为什么时间复杂度是 O(N) 而不是 O(N²)

  • 虽然有两层循环,但内层循环的次数是由外层条件控制的,即只有在找到序列的起始点时才会执行。
  • 每个元素最多只会被检查一次。在内层循环中,n 会被递增,并且这些递增操作不会重叠或重复处理相同的元素。

code

javascript 复制代码
/**
 * @param {number[]} nums
 * @return {number}
 */
var longestConsecutive = function(nums) {
    const set = new Set()
    for(let n of nums){
        set.add(n)
    }
    let maxLen = 0
    for(let n of set.values()){
        let curLen = 1
        if(!set.has(n - 1)){
            while(set.has(n + 1)){
                n++
                curLen++
            }
        }
        maxLen = Math.max(maxLen, curLen)
    }
    return maxLen
};
相关推荐
清泓y18 分钟前
Android内存管理与性能优化面试真题
android·面试·性能优化
吃饱了得干活18 分钟前
缓存与数据库一致性:从理论到实战
java·后端·面试
txzrxz22 分钟前
数论:排列数、组合数、费马小定理、逆元、同余定理
c++·算法·数论·组合数·费马小定理·逆元·排列数
xqqxqxxq25 分钟前
LeetCode Hot100 双指针专项题解笔记
笔记·算法·leetcode
闪电悠米1 小时前
力扣hot100-54.螺旋矩阵-模拟边界控制详解
算法·leetcode·矩阵
变量未定义~1 小时前
虚拟节点-星石传送阵(4星)、强连通分量
数据结构·算法
IT方大同1 小时前
C语言分支与循环语句
c语言·开发语言·算法
黄敬峰1 小时前
React 待办事项 Todos 从零到一:组件化思维、状态管理与父子通信一次讲透
面试
待磨的钝刨2 小时前
深入理解主成分分析(PCA)
人工智能·线性代数·算法·机器学习
FogLetter2 小时前
嘘!WebSocket正在“偷听”你的网络请求——全双工通信的魔法
前端·面试