1. 程式人生 > >【LeetCode 簡單題】17-合併兩個有序陣列

【LeetCode 簡單題】17-合併兩個有序陣列

宣告:

今天是第17道題。給定兩個有序整數陣列 nums1 和 nums2,將 nums2 合併到 nums1 使得 num1 成為一個有序陣列。以下所有程式碼經過樓主驗證都能在LeetCode上執行成功,程式碼也是借鑑別人的,在文末會附上參考的部落格連結,如果侵犯了博主的相關權益,請聯絡我刪除

(手動比心ღ( ´・ᴗ・` ))

正文

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

說明:

  • 初始化 nums1 和 nums2 的元素數量分別為 m 和 n
  • 你可以假設 nums1 有足夠的空間(空間大小大於或等於 m + n
    )來儲存 nums2 中的元素。

示例:

輸入:
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]    
        

結尾