給你兩個有序整數數組 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