返回
LeetCode 88 巧妙合并两个有序数组,让你轻松搞定!
后端
2023-12-10 12:09:25
合并有序数组:解法与复杂度分析
简介
在计算机编程中,数组是一种广泛使用的数据结构,用于存储一系列元素。合并有序数组是数据结构和算法中一个常见的操作,涉及将两个或多个已排序的数组合并成一个新的有序数组。本文将探讨合并有序数组的几种常用解法,并分析每种解法的复杂度。
解法一:双指针法
双指针法是一种高效且通用的合并算法。它使用两个指针,分别指向两个要合并数组的开头。算法比较指针指向的元素,并将较小的元素添加到新的有序数组中。此过程持续进行,直到两个指针都到达其各自数组的末尾。
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),因为它需要创建一个新的数组来存储合并后的结果。
结论
合并有序数组是数据结构和算法中的一个常见操作。本文讨论了三种常用的解法,包括双指针法、利用内置函数和利用额外空间。每种解法都有其独特的优缺点,选择哪种解法取决于特定的应用程序和性能要求。