返回
LeetCode:合并两个有序数组的艺术
前端
2023-10-06 10:51:54
好的,以下是关于「LeetCode 探索(18):88-合并两个有序数组」的文章。
大家好,欢迎来到 LeetCode 探索之旅的第十八篇。今天,我们将一起探索如何合并两个有序数组,使合并后的数组仍然有序。
问题
给你两个按非递减顺序排列的整数数组 nums1
和 nums2
,另有两个整数 m
和 n
,分别表示 nums1
和 nums2
中的元素数目。请你合并 nums2
到 nums1
中,使合并后的数组同样按非递减顺序排列。
解决方案
我们可以使用双指针法来解决这个问题。首先,我们定义两个指针 i
和 j
,分别指向 nums1
和 nums2
的第一个元素。然后,我们比较这两个指针指向的元素,并将较小的元素放入合并后的数组中。同时,将较小元素的指针后移。重复这个过程,直到 nums1
或 nums2
中的一个数组遍历完毕。
当一个数组遍历完毕后,我们将另一个数组中剩下的元素直接复制到合并后的数组中。
以下是详细的实现步骤:
- 定义两个指针
i
和j
,分别指向nums1
和nums2
的第一个元素。 - 创建一个新数组
merged
,用于存储合并后的数组。 - 比较
nums1[i]
和nums2[j]
,并将较小的元素放入merged
中。 - 将较小元素的指针后移。
- 重复步骤 3 和 4,直到
nums1
或nums2
中的一个数组遍历完毕。 - 将另一个数组中剩下的元素直接复制到
merged
中。 - 返回
merged
。
代码示例
def merge(nums1, m, nums2, n):
"""
:type nums1: List[int]
:type m: int
:type nums2: List[int]
:type n: int
:rtype: None Do not return anything, modify nums1 in-place instead.
"""
# 定义两个指针
i = 0
j = 0
# 创建一个新数组
merged = []
# 合并两个数组
while i < m and j < n:
if nums1[i] < nums2[j]:
merged.append(nums1[i])
i += 1
else:
merged.append(nums2[j])
j += 1
# 将剩下的元素复制到新数组
while i < m:
merged.append(nums1[i])
i += 1
while j < n:
merged.append(nums2[j])
j += 1
# 将新数组复制到 nums1
for i in range(len(merged)):
nums1[i] = merged[i]
# 测试代码
nums1 = [1, 2, 3, 0, 0, 0]
m = 3
nums2 = [2, 5, 6]
n = 3
merge(nums1, m, nums2, n)
print(nums1)
总结
以上就是合并两个有序数组的算法。这种算法的时间复杂度为 O(m + n)
,其中 m
和 n
是两个数组的长度。
希望这篇文章对您有所帮助。如果您有任何问题,欢迎在评论区留言。