利用递归实现

合并两个有序的数组

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--;
              }
          }
      }
    }
}
全部评论

相关推荐

叶扰云倾:进度更新,现在阿里云面完3面了,感觉3面答得还行,基本都答上了,自己熟悉的地方也说的比较细致,但感觉面试官有点心不在焉不知道是不是不想要我了,求阿里收留,我直接秒到岗当阿里孝子,学校那边的房子都退租了,下学期都不回学校,全职猛猛实习半年。这种条件还不诱人吗难道 然后现在约到了字节的一面和淘天的复活赛,外加猿辅导。华为笔试完没动静。 美团那边之前投了个base广州的,把我流程卡麻了,应该是不怎么招人,我直接简历挂了,现在进了一个正常的后端流程,还在筛选,不知道还有没有hc。
点赞 评论 收藏
分享
点赞 评论 收藏
分享
不愿透露姓名的神秘牛友
昨天 14:35
点赞 评论 收藏
分享
评论
2
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务