【LeetCode 簡單題】17-合併兩個有序陣列
阿新 • • 發佈:2018-12-10
宣告:
今天是第17道題。給定兩個有序整數陣列 nums1 和 nums2,將 nums2 合併到 nums1 中,使得 num1 成為一個有序陣列。以下所有程式碼經過樓主驗證都能在LeetCode上執行成功,程式碼也是借鑑別人的,在文末會附上參考的部落格連結,如果侵犯了博主的相關權益,請聯絡我刪除
(手動比心ღ( ´・ᴗ・` ))
正文
題目:給定兩個有序整數陣列 nums1 和 nums2,將 nums2 合併到 nums1 中,使得 num1 成為一個有序陣列。
說明:
- 初始化 nums1 和 nums2 的元素數量分別為 m 和 n。
- 你可以假設 nums1 有足夠的空間(空間大小大於或等於 m + n
示例:
輸入: nums1 = [1,2,3,0,0,0], m = 3 nums2 = [2,5,6], n = 3 輸出: [1,2,2,3,5,6]
解法1。drop-dead easy。直接利用Python現有的輪子,先把nums2賦值給nums1的後面,再用sort()對nums1排序,程式碼如下。
class Solution: def merge(self, nums1, m, nums2, n): """ :type nums1: List[int] :type m: int :type nums2: List[int] :type n: int :rtype: void Do not return anything, modify nums1 in-place instead. """ # V 1.0,能提交 nums1[m:m+n] = nums2[:n] nums1.sort()
解法2。從末位開始比較、開始存放元素,這樣前面小的元素可以少做修改,直接放進nums1裡或者根本不用做修改,詳細的解釋見下面程式碼中的註釋,基本思想就是逐步比較,把更大的元素放到nums1的後面,從後往前填充。
class Solution: def merge(self, nums1, m, nums2, n): # V 2.0,能提交 while m>0 and n>0: # 從陣列的最後1個元素(最大的)開始比較,大的優先放進nums1裡 if nums1[m-1] >= nums2[n-1]: nums1[m+n-1] = nums1[m-1] else: nums1[m+n-1] = nums2[n-1] # 以上執行完有2種情況: # 1.nums1裡的元素已全部處理完,nums2裡還剩n個元素(n不為0),此時直接放到nums1的前n個位置裡即可 # 2.nums2裡的元素已全部處理完,nums1裡還剩m個元素(m不為0),此時不做處理因為這m個元素還乖乖躺在前m個位置上,沒有被覆蓋 if n>0: # n此時已被修改,n裡面只剩下n個元素沒有放到nums1裡了, # 而這n個元素都是有序的,都比已經在nums1裡的元素小,所以直接放進去 nums1[:n] = nums2[:n]