利用递归实现

合并两个有序的数组

http://www.nowcoder.com/questionTerminal/89865d4375634fc484f3a24b7fe65665

递归

从两个数组的尾部开始比较,如果A[m-1] <= B[n-1],那么将最大数B[n-1]赋值给A[m+n-1],然后n-1,重复。反之将A[m-1]赋值给A[m+n-1],然后m-1。递归结束的标志有俩,当A的数组遍历完了而B没有(m==0&&n!=0),此时将B剩下的值赋值给A的数组;标志2就是,当n为0的时候,包括两种情况,第一种标志的结束标志m == 0,n == 0,另一种就是A的数组还没有遍历完B数组已经遍历完了(m!=0,n==0),这时候A数组是排序好的,不需要再遍历排序。

public class Solution {
    public void merge(int A[], int m, int B[], int n) {
       if(m == 0&&n!=0)//A的数组遍历完了,B没有
       {
           A[n-1] = B[n-1]; //直接赋值
           merge(A,0,B,n-1);
       }
       else if(n==0) //两个标志
           return;
       else{
       if(A[m-1]<=B[n-1]){
           A[m+n-1] = B[n-1];
           merge(A,m,B,n-1);
       }
        else{
            A[m+n-1] = A[m-1];
            merge(A,m-1,B,n);
        }
       }
    }
}

递归的循环版

递归比较方便,但是时间复杂度比较高,拆分成循环

public class Solution {
    public void merge(int A[], int m, int B[], int n) {
      int i = m+n-1;
      for(;i >=0;i--){
          if(m == 0)
          {
              A[i] = B[n-1];
              n--;
          }
          else if(n == 0){}
          else{
              if(A[m-1]<=B[n-1])
              {
                  A[i] = B[n-1];
                  n--;
              }
              else{
                  A[i] = A[m-1];
                  m--;
              }
          }
      }
    }
}
全部评论

相关推荐

评论
2
收藏
分享

创作者周榜

更多
牛客网
牛客企业服务