0088. Merge Sorted Array - chasel2361/leetcode GitHub Wiki
Given two sorted integer arrays nums1 and nums2, merge nums2 into nums1 as one sorted array.
Note:
The number of elements initialized in nums1 and nums2 are m and n respectively.
You may assume that nums1 has enough space (size that is greater or equal to m + n) to hold additional elements from nums2.
Example:
Input:
nums1 = [1,2,3,0,0,0], m = 3
nums2 = [2,5,6], n = 3
Output: [1,2,2,3,5,6]
題目要求在 in-place 的條件下將給定的兩個已排序陣列合併,由於 nums1 有提供空位,因此題目還給了兩個陣列排除空格後的長度 m, n。
這題可以利用 m, n 來進行合併,由於 nums1 的空位給在尾端,所以較好的方式為從尾部開始針對陣列數值比較大小,寫作程式碼如下
[1] 將 m, n 視為一個指標,當值為零表示指標走到盡頭。由於本題要求將 nums2 併入 nums1,因此當 n 值為零時表示排序完成。
[2] 第一個條件是 nums1 走完,但 nums2 尚未完全併入 nums1。第二個條件為 m 指標值小於 n 指標值,此時將 n 指標值放入 m+n-1 位置(nums2 值併入 nums1)
[3] 反之將 nums1 值往後挪
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.
"""
while n > 0: # [1]
if m <= 0 or nums1[m-1] < nums2[n-1]: # [2]
nums1[m+n-1] = nums2[n-1]
n -= 1
else: # [3]
nums1[m+n-1] = nums1[m-1]
m -= 1
這樣寫的時間複雜度是 O(N),空間複雜度為 O(1)
不過思考了一下之後,覺得可以訂出幾個變數來把程式碼寫得更清楚且快速
N1 = m-1 # nums1 指標位置
N2 = n-1 # nums2 指標位置
K = m+n-1 # 待儲存位置
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.
"""
N1, N2 = m-1, n-1
K = m+n-1
while N2 >= 0:
if N1 < 0 or nums1[N1] < nums2[N2]:
nums1[K] = nums2[N2]
N2 -= 1
K -= 1
else:
nums1[K] = nums1[N1]
N1 -= 1
K -= 1
這樣雖然沒有改變解題思路,但實際運行時可以減少很多無謂的計算量,並且讓程式碼好讀很多