88 - 合併兩個有序數組 - python

給你兩個有序整數數組 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]

題目給定了兩個有序數組,並且說明了兩個數組的元素個數。因此,暴力的方法就是分別取兩個數組的元素到nums1中,然後排序即可。因爲要依次遍歷數組元素,合併兩個數組的時間複雜度爲O(m+n)O(m + n),使用sorted()的時間複雜度爲O(n)O(n)。因此,整體的時間複雜度爲O((m+n)log(m+n))O((m+n)\log(m+n))

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.
        """
        # nums1中只有前m個數不爲零,所以只需要取前m個數進行合併
        nums1[:] = sorted(nums1[:m] + nums2)

或者將nums1中的元素另外保存,使用雙指針執行歸併過程,依次在nums1中放入當前最小的元素。

import copy
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.
        """
        # nums1中只有前m個數不爲零,所以只需要取前m個數進行合併
        temp = copy.deepcopy(nums1[:m])
        i = 0
        p, q = 0, 0

        while p < m and q < n:
            if temp[p] <= nums2[q]:
                nums1[i] = temp[p]
                i += 1
                p += 1
            else:
                nums1[i] = nums2[q]
                i += 1
                q += 1
        
        # if there are still elements to add
        if p < m: 
            nums1[p + q:] = temp[p:]
        if q < n:
            nums1[p + q:] = nums2[q:]


上面的方法是從頭到尾合併,同樣可以從尾到頭進行合併。彼此比較兩個數組中尾部元素大小,將大的元素插入到nums1的相應位置,位置索引使用i表示,i初始化爲i=m+n1i=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.
        """
        p = m -1
        q = n -1
        i = m + n - 1
        while p >= 0 and q >= 0:
            if nums1[p] > nums2[q]:
                nums1[i] = nums1[p]
                p -= 1
            else:
                nums1[i] = nums2[q]
                q -= 1
            i -= 1

        while q >= 0:
            nums1[i] = nums2[q]
            q -= 1
            i -= 1
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章