Merge Sorted Array

2017-11-21  本文已影响0人  飞飞廉

题目:

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--];
    }
};
上一篇 下一篇

猜你喜欢

热点阅读