題意:將排序好的陣列nums2合併到nums1中,使得nums1成為乙個有序陣列。假設 nums1 有足夠的空間(空間大小大於或等於 m + n)來儲存 nums2 中的元素。
方法一:雙指標方法,從後往前
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.
"""p1 = m-
1 p2 = n-
1 p = n+m-
1while p1>=
0and p2>=0:
if nums1[p1]
: nums1[p]
= nums2[p2]
p2 -=
1else
: nums1[p]
= nums1[p1]
p1 -=
1 p -=
1 nums1[
:p2+1]
=nums2[
:p2+
1]
時間複雜度為o(n+m)
空間複雜度為o(1)
nums1 = a 和 nums1[:] = a 的不同之處:
nums1 = a # 更改 nums1 這一變數名所指向的物件。讓 nums1 變數指向 a 所指向的物件,改變了原物件。
nums1[:]=a #只是對nums1所指向的物件賦值,只是值的改變,仍然是原物件。滿足原地修改的要求。
方法二:雙指標,從前往後
該方法需要先將nums1複製出來nums1_copy,然後以此和nums2進行比較,將小值移入到nums1中。
class
solution
:def
merge
(self, nums1: list[
int]
, m:
int, nums2: list[
int]
, n:
int)
->
none
: nums1_copy = nums1[
:m] nums1[:]
=[] p1=p2=
0while p1if nums1_copy[p1]
:)
p1 +=
1else:)
p2 +=
1if p1nums1[p1+p2:
]=nums1_copy[p1:
]if p2nums1[p1+p2:
]=nums2[p2:
]
時間複雜度 : o(n+m)
空間複雜度 : o(m)
方法二已經取得了最優的時間複雜度o(n+m),但需要使用額外空間,這是由於在從頭改變nums1的值時,需要把nums1中的元素存放在其他位置。
合併兩個有效陣列
給定兩個有序整數陣列 nums1 和 nums2,將 nums2 合併到 nums1 中,使得 num1 成為乙個有序陣列。初始化 nums1 和 nums2 的元素數量分別為 m 和 n。你可以假設 nums1 有足夠的空間 空間大小大於或等於 m n 來儲存 nums2 中的元素。輸入 nums...
88 合併兩個有序陣列
略。知道是在nums1上變動。如果從nums1的頭部開始放,就會出現nums1緊接著的第乙個元素還沒有nums2從頭數第二個元素小的情形,這樣就沒有辦法比較了。而從nums1的最後乙個元素開始放,能夠保證nums1和nums2的最後乙個元素一定比彼此的倒數第二個元素大。所以選擇從nums1的最後乙個...
88 合併兩個有序陣列
給定兩個有序整數陣列 nums1 和 nums2,將 nums2 合併到 nums1 中,使得 num1 成為乙個有序陣列。說明 示例 輸入 nums1 1,2,3,0,0,0 m 3 nums2 2,5,6 n 3輸出 1,2,2,3,5,6 思路 建乙個新的陣列nums,長度為m n 用乙個fo...