leetcode hot100 最长连续子序列 哈希表 medium

大 O 的加法规则 :O(f(n))+O(g(n))=O(max(f(n),g(n)))

例如:

python 复制代码
nums_sorted  = sorted(nums)
for i in range(1, len(nums_sorted)):
    ... ...

时间总复杂度 = 排序 + 遍历 。O(nlog⁡n) + O(n) = O(max(n log n, n)) = O(n log n )

(增长速度:n log n > n

时间复杂度 :O(n log n )

python 复制代码
class Solution:
    def longestConsecutive(self, nums: List[int]) -> int:
        if not nums:
            return 0

        nums_sorted  = sorted(nums)
        print(nums_sorted)

        max_len = 1
        cur_len = 1

        for i in range(1, len(nums_sorted)):
            if nums_sorted[i] == nums_sorted[i-1] + 1:   # # 连续
                cur_len +=1    # 如果最后一个数字在最长连续里,此时 max_len没有更新,就会退出循环了
            elif nums_sorted[i] == nums_sorted[i-1] :   # # 重复,题意要求,重复不算断开
                cur_len = cur_len
            else:
               max_len = max(cur_len, max_len)
               cur_len = 1

        return max(max_len, cur_len)
        

时间复杂度 :O(n)

要真正实现 O(n) → 需要用 哈希表法:

遍历每个数字,只从"序列起点"开始向右查找连续数字,这样每个数字最多访问一次 → O(n)

子序列起点:n是最小数字

python 复制代码
class Solution:
    def longestConsecutive(self, nums: List[int]) -> int:

        if not nums:
            return 0
        num_set = set(nums)   # 去重,题意重复的不算
        maxlen = 1

        for n in num_set:
            if n-1 not in num_set:   # 子序列起点:n是最小数字
                temp = n
                cur_len =1  # 子序列长度

                while temp+1 in num_set:   # 走完起点为n的子序列  # O(1) 查找
                    temp = temp+1 
                    cur_len += 1

                # 跳出while,走完子序列
                maxlen = max(maxlen, cur_len)

        return maxlen
相关推荐
小肝一下1 小时前
3. 单链表
c语言·数据结构·c++·算法·leetcode·链表·dijkstra
tachibana21 小时前
hot100 前 K 个高频元素(347)
java·数据结构·算法·leetcode
To_OC9 小时前
LC 131 分割回文串:刚学回溯时,我连怎么切字符串都想不明白
javascript·算法·leetcode
旖-旎10 小时前
LeetCode 518:零钱兑换||(完全背包)—— 题解
c++·算法·leetcode·动态规划·背包问题
To_OC11 小时前
LC 42 接雨水:暴力超时卡半天?前后缀数组一用就通了
javascript·算法·leetcode
tachibana21 天前
hot100 数组中的第K个最大元素(215)
java·数据结构·算法·leetcode
晚笙coding1 天前
LeetCode 98:验证二叉搜索树 —— 从局部判断到全局范围约束的递归思想
算法·leetcode·职场和发展
兰令水1 天前
hot100【acm版】【2026.7.21打卡-java版本】
java·开发语言·算法·leetcode·面试
退休倒计时1 天前
【每日一题】LeetCode 131. 分割回文串 TypeScript
算法·leetcode·typescript
旖-旎2 天前
LeetCode 279:完全平方数(完全背包)—— 题解
c++·算法·leetcode·动态规划·背包问题