88.合併兩個有序數組

88.合併兩個有序數組

給定兩個有序整數數組 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]
來源:力扣(LeetCode)
鏈接:https://leetcode-cn.com/problems/merge-sorted-array
著作權歸領釦網絡所有。商業轉載請聯繫官方授權,非商業轉載請註明出處。

有效信息
1.兩個有序數組,且限定大小爲m和n,並不是全部
2.nums2合併到nums1,變爲一個有序數組,且nums有足夠的大小(大於m+n)

思路
1.採用插入排序,將nums2中每個元素都插入到nums1中,核心是插入排序函數
2.根據這道題,又能聯想到歸併排序,只是歸併排序是創建一個新的數組,而非在原數組上操作。下面就是歸併排序的具體代碼

function mergeSort(nums1,nums2){
   var result=[];
   while(nums1.length||nums2.length){
       if(!nums1.length){
           result.push(nums2.shift());//shift()會更改原數組,unshift(...arg)用來將元素添加到開頭
           continue;
       }
       if(!nums2.length){
           result.push(nums1.shift());
           continue;
       }
       result.push(nums1[0]>nums2[0] ? nums2.shift():nums1.shift());
   }
   while(nums1.length){
       result.push(nums1.shift());
   }
   while(nums2.length){
       result.push(nums2.shift());
   }
   return result;
}

3.由於nums1後面預留了位置,所以我們可以設置一個指針resPointer指向m+n-1的位置,這是第一個元素要插入的位置
4.那這個位置應該放哪個元素?應該爲nums1與nums2的最大值,顯然就是Math.max(nums1[nums1.length-1],nums2[nums2.length-1];
5.由上可得,我們應該從後往前遍歷兩個數組,選取最大值,放在resPointer的位置

var merge=function(nums1,m,nums2,n){
    var resPointer=m+n-1;
    while(resPointer>=0){
        if(n===0) return;//nums2爲空數組
        if(m<1){//當nums1已經遍歷完
            nums1[resPoniter--]=nums2[--n];
            continue;
        }
        if(n<1){
            nums1[resPointer--]=nums1[--m];
            continue;
        }
        nums1[resPointer--]=nums1[m-1]>nums2[n-1] ? nums1[--m]:nums2[--n];
    }
}

leetCode分類刷題   該地址長期、每週更新LeetCode分類刷題

參考資料
  leetcode題解

發佈了23 篇原創文章 · 獲贊 4 · 訪問量 796
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章