LeetCode | Merge Sorted Array

 

Given two sorted integer arrays A and B, merge B into A as one sorted array.

Note:
You may assume that A has enough space (size that is greater or equal to m + n) to hold additional elements from B. The number of elements initialized in A and B are m andn respectively.

 

//思路是倒着合并两个数组,这样在合并时就不需要将数组A中的元素向后移动以插入B[j]了
//算法复杂度为O(n+m)
public class Solution {
    public void merge(int A[], int m, int B[], int n) {
        int i=m-1;             // A[0] - A[m-1]
        int j=n-1;             // B[0] - B[n-1]
        int k=m+n-1;           // 合并之后:A[0] - A[m+n-1]
          
        while(i>=0 && j>=0) {  
            A[k--] = A[i] > B[j] ? A[i--] : B[j--];    //倒着合并,每次取大者放入后边,取完之后对应标志下标减1
        }  
          
        /*while (i >= 0)                 //取完之后,若A有剩,其实并不需要处理,保持剩下的几个元素不动就行
            A[k--] = A[i--] ; */
            
        while(j>=0) {                    //取完之后,若B有剩,则B剩下的那几个元素一定是两个数组中最小的几个,且有序
            A[k--] = B[j--];             //依次继续从后写入A[]即可
        }  
    }
}

自己的正向遍历的笨方法:

思想是每次取B[j],然后为其在A[]中找到正确的位置插入,再后移A中的元素

public class Solution {
    public void merge(int A[], int m, int B[], int n) {
       if (n==0) return;         //如果n=0,即B[]中无任何元素,就无需对A[]做任何改动
       if (m==0) {               //如果m=0,即A[]中无任何元素,就把B[]复制给A[]
            for(int i=0;i<n;i++) 
            A[i] = B[i];
            return;
        }
        
        for (int j=0; j<n; j++){        //j代表对数组B[]的遍历,取出B[j]到A[]中找正确位置
            if (B[j] >= A[m-1+j]) {A[m+j] = B[j]; continue;}  //如果B[j]比现任的A[]中最大元素还大,就直接把B[j]贴在A[]最后
        for (int i=0; i<m+j; i++){      //i代表对数组A[]的遍历,为B[j]定位位置,对A[m-1+j]的比较在上边if中完成
            if (A[i] >= B[j]){          //表示找到了B[j]应该插入的正确位置
                for(int k=m-1+j;k>=i;k--) { A[k+1] = A[k]; }   //则把包括A[i]的A[i]-A[m-1+j]都向后移一位,此时A[i]=A[i+1]
                A[i] = B[j];            //把B[i]插入到A[i]的位置
                break;
            }
            //break;    //注意:不能把break放在这,否则当A[i] < B[j]时,也会break,转而执行外层循环的if判断了
                        //而不是向后继续找A[i] >= B[j]的A[i]了
        }
      }
    }
}

  






原文地址:https://www.cnblogs.com/dosmile/p/6444480.html