返回

LeetCode 128:找到数组中的最长连续序列

后端

发现最长连续序列:LeetCode 128 征服指南

简介

在 LeetCode 第 128 题“最长连续序列”中,我们面临一个未排序的整数数组。我们的目标是找到这个数组中最长的连续数字序列,并返回这个序列的长度。记住,序列中的元素不需要在数组中连续出现,但它们必须是连续的数字。

动态规划:逐步解决之道

为了解决这个问题,我们将使用动态规划算法。动态规划是一种解决复杂问题的强大技术,它特别适合处理具有重叠子问题的场景。在我们的例子中,我们可以通过计算每个元素作为连续序列起点的最长连续序列长度,来逐步构建出整个数组的最长连续序列长度。

Python 代码实现:简洁高效

def longest_consecutive(nums):
  """
  返回给定数组中连续数字最长序列的长度。

  参数:
    nums: 整数列表。

  返回:
    最长连续序列的长度。
  """

  # 创建一个集合来存储数组中的唯一元素。
  num_set = set(nums)

  # 初始化最长连续序列长度为 0。
  longest_seq = 0

  # 遍历数组中的每个元素。
  for num in nums:
    # 如果该元素不是连续序列的开头,则跳过。
    if num - 1 in num_set:
      continue

    # 初始化当前连续序列长度为 1。
    current_seq = 1

    # 递增当前连续序列长度,直到到达非连续元素。
    while num + current_seq in num_set:
      current_seq += 1

    # 更新最长连续序列长度,如果需要的话。
    longest_seq = max(longest_seq, current_seq)

  # 返回最长连续序列长度。
  return longest_seq


# 使用示例数组测试函数。
nums = [100, 4, 200, 1, 3, 2]
result = longest_consecutive(nums)
print(result)  # 输出:4

复杂度分析:时间与空间

  • 时间复杂度: O(n),其中 n 是数组 nums 的长度。

  • 空间复杂度: O(n),因为我们需要创建一个集合来存储数组中的唯一元素。

总结:动力规划的胜利

通过使用动态规划算法,我们能够在 O(n) 的时间复杂度内解决 LeetCode 第 128 题“最长连续序列”。我们创建了一个集合来存储数组中的唯一元素,并通过迭代每个元素来逐步构建出最长的连续序列长度。这个算法简单易懂,并且可以有效地解决问题。

常见问题解答

  1. 为什么我们需要使用集合来存储唯一元素?

    集合可以帮助我们快速检查一个元素是否已经在数组中出现过,从而避免重复计算。

  2. 如果数组中有多个最长连续序列,算法如何处理?

    该算法会找到所有以每个元素为起点的最长连续序列长度,并返回其中最长的一个。

  3. 动态规划算法是否适用于其他类似问题?

    是的,动态规划算法广泛应用于解决具有重叠子问题的复杂问题,例如最长公共子序列和背包问题。

  4. 如何提高算法的效率?

    我们可以使用哈希表来存储每个元素和它作为连续序列起点时的最长连续序列长度。这将允许我们直接查找而不是线性搜索。

  5. 算法是否可以扩展到处理非常大的数组?

    是的,该算法可以扩展到处理非常大的数组,因为它只需要 O(n) 的空间,其中 n 是数组的长度。