88 合併兩個有序陣列 LeetCode

2021-09-29 05:28:46 字數 2096 閱讀 9196

給定兩個有序整數陣列 nums1 和 nums2,將 nums2 合併到 nums1 中,使得 num1 成為乙個有序陣列。

說明:初始化 nums1 和 nums2 的元素數量分別為 m 和 n。

你可以假設 nums1 有足夠的空間(空間大小大於或等於 m + n)來儲存 nums2 中的元素。

分析:方法一:

首先將兩個陣列中元素合併在num1中,然後對新得到的陣列中元素重新排序。

class

solution

:def

merge

(self, nums1: list[

int]

, m:

int, nums2: list[

int]

, n:

int)

->

none

: nums1[:]

=sorted

(nums1[

:m]+ nums2)

方法二:

通過借助第三個陣列,將兩個陣列中的元素按順序新增到nums1中。關鍵點:①利用兩個指標分別指向兩個元組元素進行比較;②對於剩餘的較大元素的處理。

class

solution

(object):

defmerge

(self, nums1, m, nums2, n)

:# 將陣列 nums1中的元素賦值在乙個新的元組後,令 nums1為空列表.

nums1_copy = nums1[

:m]

nums1[:]

=[]# 分別使用p1和p2兩個指標指向陣列 nums1_copy和 nums2.

p1 =

0 p2 =

0# 按照先後順序對兩個陣列中元素的大小作比較,並選擇最小的元素新增到列表 nums1中.

while p1 < m and p2 < n:

if nums1_copy[p1]

< nums2[p2]: )

p1 +=

1else:)

p2 +=

1# 對於兩個元組中剩餘的元素

if p1 < m:

nums1[p1 + p2:

]= nums1_copy[p1:

]if p2 < n:

nums1[p1 + p2:

]= nums2[p2:

]

方法三:

為了節省方法二中的空間複雜度,即:不使用第三個列表「nums1_copy」,通過逆序的方式,將nums2中元素新增到nums1中。

class

solution

:def

merge

(self, nums1: list[

int]

, m:

int, nums2: list[

int]

, n:

int)

->

none

:# 指定 nums1 和 nums2 的兩個指標,分別指兩陣列的最大值

p1 = m -

1 p2 = n -

1# 指定 len(nums1)=m+n-1的 陣列指標

p = m + n -

1# 判斷:將兩陣列中的最大值放置在最終陣列中的最後位置。

while p1 >=

0and p2 >=0:

if nums1[p1]

< nums2[p2]

: nums1[p]

= nums2[p2]

p2 -=

1else

: nums1[p]

= nums1[p1]

p1 -=

1 p -=

1# 如果nums2中還有剩餘元素,則將其新增到最前面的位置。

nums1[

:p2 +1]

= nums2[

:p2 +

1]

結論:對於兩個陣列中元素的排序方式分為:全排序,從小到大排序和從大到小排序。

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...

88 合併兩個有序陣列

給定兩個有序整數陣列 nums1 和 nums2,將 nums2 合併到 nums1 中,使得 num1 成為乙個有序陣列。說明 初始化 nums1 和 nums2 的元素數量分別為 m 和 n。你可以假設 nums1 有足夠的空間 空間大小大於或等於 m n 來儲存 nums2 中的元素。示例 輸...