88. Merge Sorted Array

Borris發表於2019-10-04

解法一

思路

直接使用 System.arraycopy() 函式後 sort。

程式碼
class Solution {
    public void merge(int[] nums1, int m, int[] nums2, int n) {
        System.arraycopy(nums2, 0, nums1, m, n); // nums2: 要 copy 的陣列; 0: 開始 copy 的位置; nums1: copy in 陣列; m: copy in 的位置; n: copy 的個數
        Arrays.sort(nums1);
    }
}

時間複雜度 O((n+m)log(m+n)),因為自己進行了一次排序。

解法一

思路

利用 sorted array 這個條件。
在兩個陣列最後一個有效值處放置指標 (n-1 和 m-1)並且在 nums1 的末尾放置指標 n + m -1
如果兩個陣列指標都還沒到頭
把 nums1的末尾和 nums2 的末尾值較大的那個放到陣列的末尾。陣列末尾指標前移,較大數所在陣列指標前移。
如果 nums1 指標到頭而 nums2 的還沒到頭
把剩餘的 nums2 元素放進 nums1 中
如果 nums2 到頭而 nums1 還沒到頭
無需進行任何操作因為 nums1 已經排序過了

程式碼
class Solution {
    public void merge(int[] nums1, int m, int[] nums2, int n) {
        int l1 = m - 1;
        int l2 = n - 1;
        int last  = n + m - 1;
        while (l1 >= 0 && l2 >= 0) {
            if (nums1[l1] >= nums2[l2]) {
                nums1[last] = nums1[l1];
                l1--;
            }
            else {
                nums1[last] = nums2[l2];
                l2--;
            }
            last--;
        }

        while (l2 >= 0) {
            nums1[last--] = nums2[l2--];
        }
    }
}
本作品採用《CC 協議》,轉載必須註明作者和本文連結

相關文章