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
相关推荐
一叶落4381 小时前
LeetCode 21. 合并两个有序链表(C语言详解 | 链表经典题)
c语言·数据结构·c++·算法·leetcode·链表
阿里嘎多哈基米1 小时前
速通Hot100-Day04——哈希
数据结构·算法·leetcode·哈希算法·散列表
xsyaaaan1 小时前
leetcode-hot100-普通数组:53最大子数组和-56合并区间-189轮转数组-238除了自身以外数组的乘积-41缺失的第一个正数
leetcode
客卿1232 小时前
力扣--组合,子集--回溯法的再探索--总结回溯法
java·算法·leetcode
_日拱一卒2 小时前
LeetCode(力扣):环形链表
算法·leetcode·链表
做怪小疯子2 小时前
Leetcode刷题——链表就地反转
算法·leetcode·链表
Eward-an3 小时前
高效构建长度为 n 的开心字符串中第 k 小的字符串
python·leetcode
样例过了就是过了4 小时前
LeetCode热题100 电话号码的字母组合
数据结构·c++·算法·leetcode·dfs
big_rabbit05025 小时前
[算法][力扣226]翻转一颗二叉树
数据结构·算法·leetcode
TracyCoder1235 小时前
LeetCode Hot100(65/100)——64. 最小路径和
算法·leetcode·职场和发展