美文网首页
Merge Sorted Array

Merge Sorted Array

作者: 飞飞廉 | 来源:发表于2017-11-21 15:45 被阅读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--];
        }
    };
    

    相关文章

      网友评论

          本文标题:Merge Sorted Array

          本文链接:https://www.haomeiwen.com/subject/tpkwvxtx.html