返回

LeetCode 88 巧妙合并两个有序数组,让你轻松搞定!

后端

合并有序数组:解法与复杂度分析

简介

在计算机编程中,数组是一种广泛使用的数据结构,用于存储一系列元素。合并有序数组是数据结构和算法中一个常见的操作,涉及将两个或多个已排序的数组合并成一个新的有序数组。本文将探讨合并有序数组的几种常用解法,并分析每种解法的复杂度。

解法一:双指针法

双指针法是一种高效且通用的合并算法。它使用两个指针,分别指向两个要合并数组的开头。算法比较指针指向的元素,并将较小的元素添加到新的有序数组中。此过程持续进行,直到两个指针都到达其各自数组的末尾。

def merge(nums1, nums2):
  """
  使用双指针法合并两个有序数组

  参数:
    nums1 (list): 第一个有序数组
    nums2 (list): 第二个有序数组

  返回:
    list: 合并后的有序数组
  """

  i = 0
  j = 0
  merged = []

  while i < len(nums1) and j < len(nums2):
    if nums1[i] < nums2[j]:
      merged.append(nums1[i])
      i += 1
    else:
      merged.append(nums2[j])
      j += 1

  while i < len(nums1):
    merged.append(nums1[i])
    i += 1

  while j < len(nums2):
    merged.append(nums2[j])
    j += 1

  return merged

时间复杂度: O(n + m),其中 n 和 m 分别是两个数组的长度。

空间复杂度: O(1),因为它不需要额外空间来存储合并后的数组。

解法二:利用内置函数

Python 提供了内置的 sorted() 函数,可以对可迭代对象(例如列表)进行排序。我们可以利用此函数将两个有序数组合并成一个新的有序数组。

def merge(nums1, nums2):
  """
  使用 sorted() 函数合并两个有序数组

  参数:
    nums1 (list): 第一个有序数组
    nums2 (list): 第二个有序数组

  返回:
    list: 合并后的有序数组
  """

  return sorted(nums1 + nums2)

时间复杂度: O(n log(n + m)),其中 n 和 m 分别是两个数组的长度。

空间复杂度: O(n + m),因为它需要创建一个新的数组来存储合并后的结果。

解法三:利用额外空间

另一种合并有序数组的方法是创建第三个数组来存储合并后的结果。我们可以迭代两个原始数组,并将较小的元素添加到第三个数组中。

def merge(nums1, nums2):
  """
  使用额外空间合并两个有序数组

  参数:
    nums1 (list): 第一个有序数组
    nums2 (list): 第二个有序数组

  返回:
    list: 合并后的有序数组
  """

  merged = []
  i = 0
  j = 0

  while i < len(nums1) and j < len(nums2):
    if nums1[i] < nums2[j]:
      merged.append(nums1[i])
      i += 1
    else:
      merged.append(nums2[j])
      j += 1

  while i < len(nums1):
    merged.append(nums1[i])
    i += 1

  while j < len(nums2):
    merged.append(nums2[j])
    j += 1

  return merged

时间复杂度: O(n + m),其中 n 和 m 分别是两个数组的长度。

空间复杂度: O(n + m),因为它需要创建一个新的数组来存储合并后的结果。

结论

合并有序数组是数据结构和算法中的一个常见操作。本文讨论了三种常用的解法,包括双指针法、利用内置函数和利用额外空间。每种解法都有其独特的优缺点,选择哪种解法取决于特定的应用程序和性能要求。