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
};
相关推荐
6Hzlia6 小时前
【Hot 100 刷题计划】 LeetCode 739. 每日温度 | C++ 逆序单调栈
c++·算法·leetcode
良木生香6 小时前
【C++初阶】:STL——String从入门到应用完全指南(1)
c语言·开发语言·数据结构·c++·算法
仙草不加料6 小时前
互联网大厂Java面试故事实录:三轮场景化技术提问与详细答案解析
java·spring boot·微服务·面试·aigc·电商·内容社区
XWalnut6 小时前
LeetCode刷题 day16
数据结构·算法·leetcode·链表·动态规划
落魄江湖行7 小时前
基础篇一 Java 有了 int 为什么还要 Integer?它们到底差在哪?
java·面试·八股文
星辰_mya7 小时前
OSI 七层模型之“跨国诈骗集团”深度讲解
运维·服务器·后端·面试·架构师
foundbug9998 小时前
基于混合整数规划的电池容量优化 - MATLAB实现
数据结构·算法·matlab
木斯佳8 小时前
前端八股文面经大全:字节暑期前端一面(2026-04-21)·面经深度解析
前端·面试·校招·面经·实习
我叫黑大帅9 小时前
其实跨域问题是后端来解决的? CORS
后端·面试·go