最长连续序列

最长连续序列

问题描述

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

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

解决思路

要解决这个问题,可以使用哈希表来存储数组中的数,并通过遍历数组来寻找连续序列。具体解决步骤如下:

  1. 创建一个哈希表 num_set,用于存储数组中的数。

  2. 初始化变量 longseq 为 0,用于记录最长连续序列的长度。

  3. 遍历数组 nums 中的每个数 num

    • 首先检查 num - 1 是否在 num_set 中,如果不在,则说明 num 可以作为一个连续序列的起点。
    • 如果 num - 1 不在 num_set 中,表示以 num 为起点的连续序列开始了,初始化 current_seq 为 1,并初始化 current_numnum
    • 在内层循环中,不断检查 current_num + 1 是否在 num_set 中,如果存在,表示连续序列继续,将 current_seq 自增,current_num 自增。
    • 如果连续序列的长度 current_seq 大于 longseq,则更新 longseq
  4. 返回 longseq 作为最长连续序列的长度。

代码实现

以下是使用Python编写的代码,实现了上述解决思路,并添加了注释以解释每个步骤:

class Solution:
    def longestConsecutive(self, nums):
        # 初始化最长连续序列的长度为0
        longseq = 0
        # 创建一个哈希表,用于存储数组中的数
        num_set = set(nums)

        # 遍历数组中的每个数
        for num in nums:
            # 如果 num - 1 不在 num_set 中,表示 num 可以作为连续序列的起点
            if num - 1 not in num_set:
                current_seq = 1
                current_num = num

                # 在内层循环中检查连续序列的长度
                while current_num + 1 in num_set:
                    current_seq += 1
                    current_num += 1

                # 更新最长连续序列的长度
                if longseq < current_seq:
                    longseq = current_seq

        # 返回最长连续序列的长度
        return longseq

时间复杂度分析

这个算法需要遍历数组 nums,对于每个数的查找操作可以在常数时间内完成,因此时间复杂度是 O(n),其中 n 是数组的长度。

空间复杂度分析

这个算法使用了一个哈希表 num_set 来存储数组中的数,哈希表的空间复杂度取决于数组中不同元素的数量,最坏情况下为 O(n)。因此,空间复杂度是 O(n)。

结论

最长连续序列问题是一个有趣的问题,通过使用哈希表和巧妙的遍历方法,可以在线性时间内解决。这个算法的时间复杂度和空间复杂度都在合理范围内,适用于大多数情况。希望这篇博客能够帮助你更好地理解和解决最长连续序列问题。

你可能感兴趣的:(LeetCode刷题,python,算法)