题目:
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.
思路:
混合插入有序数组,由于两个数组都是有序的,所以先建立一个m+n的数组,然后从数组A和数组B中依次取出数来比较,把较小的写入数组,index(a/b)往前走1,再必将当前的A[a]和B[b].最后比较两组元素有剩余的,两种情况,依次填进去即可,最后将数组赋值给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];
}
};
优化
由于两个数组都是有序的,新合并的数组的长度是m+n,所以可以从后边往前边赋值,比较A和B的值,把大的从后边塞进数组A,如果A[a]大,就把A[a]拉到后边A[count],如果B[b]大也是放进A[count]中。首先比较A和B的最后一个元素。把大的放进A[m+n-1]处,再依次向前推,全比较完之后,把剩余的元素塞进A中。如果A循环完了B还有剩余,直接用个循环把B中的元素覆盖到A剩下的位置,如果B循环完了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--];
}
};
网友评论