給定兩個有序整數陣列 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 中的元素。示例 輸...