題目:
leetcode 88
Given two sorted integer arrays nums1 and nums2, merge nums2 into nums1 as one sorted array.
Note:
You may assume that nums1 has enough space (size that is greater or equal to m + n) to hold additional elements from nums2. The number of elements initialized in nums1 and nums2 are m and n respectively.
思路:
混合插入有序數(shù)組,由于兩個數(shù)組都是有序的拂酣,所以先建立一個m+n的數(shù)組仲义,然后從數(shù)組A和數(shù)組B中依次取出數(shù)來比較婶熬,把較小的寫入數(shù)組,index(a/b)往前走1虽另,再必將當(dāng)前的A[a]和B[b].最后比較兩組元素有剩余的饺谬,兩種情況,依次填進(jìn)去即可募寨,最后將數(shù)組賦值給A
代碼
var merge = function(nums1, m, nums2, n) {
var res=[];
var a=0;
var b=0;
for(var i=0;i<m+n;i++){
if(a<m && b<n){
if(nums1[a]<nums2[b]){
res[i]=nums1[a];
a++;
}else{
res[i]=nums2[b];
b++;
}
}else if(a>=m && b<n ){
res[i]=nums2[b];
b++
}else if(a<m && b>=n){
res[i]=nums1[a];
a++;
}else{
return;
}
}
for(var i=0;i<m+n;i++){
nums1[i]=res[i];
}
};
優(yōu)化
由于兩個數(shù)組都是有序的,新合并的數(shù)組的長度是m+n,所以可以從后邊往前邊賦值仪缸,比較A和B的值列肢,把大的從后邊塞進(jìn)數(shù)組A,如果A[a]大瓷马,就把A[a]拉到后邊A[count],如果B[b]大也是放進(jìn)A[count]中。首先比較A和B的最后一個元素决采。把大的放進(jìn)A[m+n-1]處,再依次向前推拇厢,全比較完之后晒喷,把剩余的元素塞進(jìn)A中。如果A循環(huán)完了B還有剩余凉敲,直接用個循環(huán)把B中的元素覆蓋到A剩下的位置,如果B循環(huán)完了A還有剩余的元素爷抓,不動就是了。
var merge = function(nums1, m, nums2, n) {
var a=m-1;
var b=n-1;
var count=m+n-1;
while(a>=0 && b>=0){
nums1[count--]=nums1[a]>nums2[b]?nums1[a--]:nums2[b--];
}
while( b>=0){
nums1[count--]=nums2[b--];
}
};