leetcode-面試經典150題

MoonBeautiful發表於2024-08-12
https://leetcode.cn/problems/merge-sorted-array/description/?envType=study-plan-v2&envId=top-interview-150
88. 合併兩個有序陣列
已解答
簡單
相關標籤
相關企業
提示

給你兩個按 非遞減順序 排列的整數陣列 nums1 nums2,另有兩個整數 mn ,分別表示 nums1nums2 中的元素數目。

請你 合併 nums2 nums1 中,使合併後的陣列同樣按 非遞減順序 排列。

注意:最終,合併後陣列不應由函式返回,而是儲存在陣列 nums1 中。為了應對這種情況,nums1 的初始長度為 m + n,其中前 m 個元素表示應合併的元素,後 n 個元素為 0 ,應忽略。nums2 的長度為 n

示例 1:

輸入:nums1 = [1,2,3,0,0,0], m = 3, nums2 = [2,5,6], n = 3
輸出:[1,2,2,3,5,6]
解釋:需要合併 [1,2,3] 和 [2,5,6] 。
合併結果是 [1,2,2,3,5,6] ,其中斜體加粗標註的為 nums1 中的元素。

示例 2:

輸入:nums1 = [1], m = 1, nums2 = [], n = 0
輸出:[1]
解釋:需要合併 [1] 和 [] 。
合併結果是 [1] 。

示例 3:

輸入:nums1 = [0], m = 0, nums2 = [1], n = 1
輸出:[1]
解釋:需要合併的陣列是 [] 和 [1] 。
合併結果是 [1] 。
注意,因為 m = 0 ,所以 nums1 中沒有元素。nums1 中僅存的 0 僅僅是為了確保合併結果可以順利存放到 nums1 中。

提示:

  • nums1.length == m + n
  • nums2.length == n
  • 0 <= m, n <= 200
  • 1 <= m + n <= 200
  • -109 <= nums1[i], nums2[j] <= 109

進階:你可以設計實現一個時間複雜度為 O(m + n) 的演算法解決此問題嗎?

go

func merge(nums1 []int, m int, nums2 []int, n int) {
    i := m - 1
    j := n - 1
    h := m + n - 1
    for {
        if j < 0 && i < 0 {
            break
        }

        if i < 0 && j >= 0 {
            nums1[h] = nums2[j]
            j--
            h--
            continue
        }

        if j < 0 && i >= 0 {
            nums1[h] = nums1[i]
            i--
            h--
            continue
        }

        if nums1[i] >= nums2[j] {
            nums1[h] = nums1[i]
            i--
            h--
        } else {
            nums1[h] = nums2[j]
            j--
            h--
        }
    }
}

相關文章