1. 程式人生 > 實用技巧 >leetcode 88. 合併兩個有序陣列

leetcode 88. 合併兩個有序陣列


本題 題目連結

題目描述


我的題解

!!!記住:一般而言,對於有序陣列可以通過 雙指標法 達到 O(n + m) 的時間複雜度。

(要開闢新空間的方法就不說了)

方法:雙指標(從後往前)

思路分析

  • 不開闢新空間,直接在 nums1 陣列上操作。
  • 一般而言我們會想到從前往後分別遍歷 nums1 和 nums2。但是這樣的話,交換數字之類的超麻煩,似乎也不容易實現!
  • 那麼,既然能從前往後,反正又是有序陣列,那我也能從後往前呀,似乎並沒有啥區別。能前往後,自然也能後往前嘛。
  • 而前往後的缺點就是空間不夠。那後往前呢?我們最終是要把 nums2 放進 nums1 裡的,那 nums1 後面不是還有 n 個位置的空間嘛!空間這麼多,就不怕交換位置造成的麻煩啦!
  • 指標 i、j 分別指向 nums1、nums2 最後一個元素,而 cur 指標為當前可以放入的位置。

程式碼如下

    public void merge(int[] nums1, int m, int[] nums2, int n) {

        if (n == 0 || nums2 == null || nums1 == null) return;
        if (m == 0) {
            if (nums2 != null) {
                for (int i = 0; i < n; i++)
                    nums1[i] = nums2[i];
            }
            return;
        }

        int i = m - 1;
        int j = n - 1;
        int cur = m + n - 1;
        while (j >= 0) {
            if (nums1[i] > nums2[j]) {
                nums1[cur--] = nums1[i--];
            } else {
                nums1[cur--] = nums2[j--];
            }
            if (i == -1) { // num1前m個元素的遍歷結束了
                while (j != -1) nums1[cur--] = nums2[j--];
            }
        }
        // System.out.println(Arrays.toString(nums1));
    }