给你两个有序整数数组 nums1 和 nums2,请你将 nums2 合并到 nums1 中,使 num1 成为一个有序数组。
说明:
- 初始化 nums1 和 nums2 的元素数量分别为 m 和 n 。
- 你可以假设 nums1 有足够的空间(空间大小大于或等于 m + n)来保存 nums2 中的元素。
示例:
输入:
nums1 = [1,2,3,0,0,0], m = 3
nums2 = [2,5,6], n = 3
输出: [1,2,2,3,5,6]
题目给定了两个有序数组,并且说明了两个数组的元素个数。因此,暴力的方法就是分别取两个数组的元素到nums1
中,然后排序即可。因为要依次遍历数组元素,合并两个数组的时间复杂度为
,使用sorted()
的时间复杂度为
。因此,整体的时间复杂度为
。
class Solution:
def merge(self, nums1: List[int], m: int, nums2: List[int], n: int) -> None:
"""
Do not return anything, modify nums1 in-place instead.
"""
# nums1中只有前m个数不为零,所以只需要取前m个数进行合并
nums1[:] = sorted(nums1[:m] + nums2)
或者将nums1中的元素另外保存,使用双指针执行归并过程,依次在nums1中放入当前最小的元素。
import copy
class Solution:
def merge(self, nums1: List[int], m: int, nums2: List[int], n: int) -> None:
"""
Do not return anything, modify nums1 in-place instead.
"""
# nums1中只有前m个数不为零,所以只需要取前m个数进行合并
temp = copy.deepcopy(nums1[:m])
i = 0
p, q = 0, 0
while p < m and q < n:
if temp[p] <= nums2[q]:
nums1[i] = temp[p]
i += 1
p += 1
else:
nums1[i] = nums2[q]
i += 1
q += 1
# if there are still elements to add
if p < m:
nums1[p + q:] = temp[p:]
if q < n:
nums1[p + q:] = nums2[q:]
上面的方法是从头到尾合并,同样可以从尾到头进行合并。彼此比较两个数组中尾部元素大小,将大的元素插入到nums1的相应位置,位置索引使用i
表示,i
初始化为
class Solution:
def merge(self, nums1: List[int], m: int, nums2: List[int], n: int) -> None:
"""
Do not return anything, modify nums1 in-place instead.
"""
p = m -1
q = n -1
i = m + n - 1
while p >= 0 and q >= 0:
if nums1[p] > nums2[q]:
nums1[i] = nums1[p]
p -= 1
else:
nums1[i] = nums2[q]
q -= 1
i -= 1
while q >= 0:
nums1[i] = nums2[q]
q -= 1
i -= 1