1. 程式人生 > 其它 >LeetCode88. 合併兩個有序陣列

LeetCode88. 合併兩個有序陣列

LeetCode88. 合併兩個有序陣列

題目說明

/**
     * 
     * 給你兩個有序整數陣列nums1 和 nums2,
     * 請你將 nums2 合併到nums1中,使 nums1 成為一個有序陣列。
     * <p>
     * 初始化nums1 和 nums2 的元素數量分別為m 和 n 。
     * 你可以假設nums1 的空間大小等於m + n,
     * 這樣它就有足夠的空間儲存來自 nums2 的元素。
     * 
     */

思路分析

  1. 因為給定的陣列是有序的,即按照升序排列的,假定陣列1的長度為兩陣列長度之和,將合併後的元素儲存到陣列1中
  2. 可以使用逆向遍歷法,即從陣列的後邊往前遍歷,因為陣列的後邊元素更大,而且陣列1後邊的部分元素是空的,從後往前依次比較兩個陣列中元素的大小,將較大者依次儲存陣列1的後邊
  3. 當某一陣列中其他元素全部取完後,則直接從剩下的一個數組中取
  4. 原始碼見下

原始碼及分析

/**
     *
     * @param nums1 要合併的陣列1
     * @param m 陣列1的長度
     * @param nums2 要合併的陣列2
     * @param n 陣列2的長度
     */
    public void merge(int[] nums1, int m, int[] nums2, int n) {
        //定義兩個指標指向兩個陣列末尾,從後往前遍歷,因為陣列是有序的,即陣列後邊的元素大於前邊的
        int i = m - 1, j = n - 1;
        //再定義指標k用於將陣列中比較後較大的值依次放入陣列末尾,cur記錄當前的較大的數
        int k = m + n - 1, cur = 0;
        //迴圈掃描兩個陣列
        while (i >= 0 || j >= 0) {
            //如果第一個陣列已經掃描完畢,則將第二個陣列的所有元素全部放入num1
            if (i == -1) {
                cur = nums2[j];
                j--;
                //同理如果第二個陣列掃描完畢
            } else if (j == -1) {
                cur = nums1[i];
                i--;
                //比較兩個陣列中末尾的元素大小,將大者先放入num1
            } else if (nums1[i] > nums2[j]) {
                cur = nums1[i];
                i--;
            } else {
                cur = nums2[j];
                j--;
            }
            //迴圈將較大者存入陣列
            nums1[k] = cur;
            k--;
        }

    }