返回

128. 最长连续序列:打造最优解法,见证算法之美

后端





**128. 最长连续序列** 

**题目** 

给定一个未排序的整数数组 nums ,找出其中最长连续序列的长度。

连续序列是指每个数字都比前一个数字大 1 的数字序列。

**示例 1:** 

输入:nums = [100, 4, 200, 1, 3, 2]
输出:4
解释:最长连续序列是 [1, 2, 3, 4]。


**示例 2:** 

输入:nums = [0, 3, 7, 2, 5, 8, 4, 6, 0, 1]
输出:9
解释:最长连续序列是 [0, 1, 2, 3, 4, 5, 6, 7, 8]。


**提示:** 

* 1 <= nums.length <= 10^5
* -10^9 <= nums[i] <= 10^9

**最优解法** 

这道题可以用动态规划来解决。我们可以创建一个哈希表来存储每个数字出现的次数,然后从每个数字开始,向两边扩展,直到遇到已经访问过的数字或超过数组边界。在扩展过程中,我们可以记录当前序列的长度,并更新最长连续序列的长度。

**具体实现步骤如下:** 

1. 创建一个哈希表 `hash` 来存储每个数字出现的次数。
2. 遍历数组 `nums` 中的每个数字 `num`。
3. 检查 `hash[num - 1]` 是否存在。如果存在,则说明 `num` 不是连续序列的第一个数字,跳过当前数字。
4. 如果 `hash[num - 1]` 不存在,则说明 `num` 是连续序列的第一个数字。
5. 从 `num` 开始,向两边扩展,直到遇到已经访问过的数字或超过数组边界。
6. 在扩展过程中,记录当前序列的长度 `length`。
7. 更新最长连续序列的长度 `max_length`。
8. 将 `num` 及其出现的次数添加到哈希表 `hash` 中。

**代码实现** 

```python
def longest_consecutive(nums):
  """
  :type nums: List[int]
  :rtype: int
  """

  # 创建哈希表存储每个数字出现的次数
  hash = {}
  for num in nums:
    hash[num] = 1

  # 遍历数组中的每个数字
  max_length = 0
  for num in nums:
    # 检查前一个数字是否在哈希表中
    if num - 1 not in hash:
      # 如果前一个数字不在哈希表中,则从当前数字开始扩展
      length = 1
      while num + 1 in hash:
        num += 1
        length += 1

      # 更新最长连续序列的长度
      max_length = max(max_length, length)

  return max_length

时间复杂度

该算法的时间复杂度是 O(n),其中 n 是数组 nums 的长度。

空间复杂度

该算法的空间复杂度是 O(n),其中 n 是数组 nums 的长度。

总结

在这篇文章中,我们一起探索了 128. 最长连续序列这道题,揭秘了其最优解法背后的奥秘。我们深入浅出地讲解了算法、动态规划、数据结构和编程等知识,帮助你深刻理解问题的本质,掌握解决这类问题的通用方法。