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題解