88合併兩個有效陣列

2021-10-03 11:05:54 字數 1695 閱讀 7102

題意:將排序好的陣列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...