LeetCode热题100-最长连续序列

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

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

题目要求时间复杂度On,如果使用暴力解法时间复杂度为On2,不满足要求。解体的关键点在于避免重复遍历,只从连续序列的 "起点" 开始计数,这样才能保证每个数字只被处理一次,实现真正的 O (n) 效率。

判断「num-1 不存在」,就是筛选出 "序列起点":

  • 1 的 num-1 = 0(不在集合中)→ 是起点,开始计数;
  • 2 的 num-1 = 1(在集合中)→ 不是起点,跳过;
  • 3 的 num-1 = 2(在集合中)→ 不是起点,跳过;
  • 4 的 num-1 = 3(在集合中)→ 不是起点,跳过;
  • 100 的 num-1 = 99(不在集合中)→ 是起点,计数;
  • 200 的 num-1 = 199(不在集合中)→ 是起点,计数;这样每个序列只从起点遍历一次,所有数字总共只被处理一遍,时间复杂度就是 O (n)。
python 复制代码
class Solution:
    def longestConsecutive(self, nums: List[int]) -> int:
        nums_set = set(nums)  # 去重很关键

        max_len = 0

        for num in nums_set:
            if num -1 not in nums_set:
                cur_num = num
                cur_len = 1
                while cur_num + 1 in nums_set:
                    cur_num += 1
                    cur_len += 1
                
                max_len = max(cur_len, max_len)
        
        return max_len
相关推荐
风筝在晴天搁浅21 分钟前
n个六面的骰子,扔一次之后和为k的概率是多少?
算法
MATLAB代码顾问2 小时前
Python实现蜂群算法优化TSP问题
开发语言·python·算法
代码飞天2 小时前
机器学习算法和函数整理——助力快速查阅
人工智能·算法·机器学习
jiushiapwojdap2 小时前
LU分解法求解线性方程组Matlab实现
数据结构·其他·算法·matlab
笨笨饿2 小时前
69_如何给自己手搓一个串口
linux·c语言·网络·单片机·嵌入式硬件·算法·个人开发
纽扣6673 小时前
【算法进阶之路】链表进阶:删除、合并、回文与排序全解析
数据结构·算法·链表
消失的旧时光-19433 小时前
统一并发模型:线程、Reactor、协程本质是一件事(从线程到协程 · 第6篇·终章)
java·python·算法
智者知已应修善业3 小时前
【51单片机不用数组动态数码管显示字符和LED流水灯】2023-10-3
c++·经验分享·笔记·算法·51单片机
AI进化营-智能译站4 小时前
ROS2 C++开发系列16-智能指针管理传感器句柄|告别ROS2节点内存泄漏与野指针
java·c++·算法·ai
CS创新实验室5 小时前
从盘边到芯端——硬盘接口七十年变迁史
算法·磁盘调度