题解 | #合并两个有序的数组#

合并两个有序的数组

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

题解一:从尾部开始合并
图示:
图片说明
复杂度分析:
时间复杂度:O(M+N)
空间复杂度:O(1)
实现如下:

class Solution {
public:
    void merge(int A[], int m, int B[], int n) {
      int end = m+n-1, i = m-1,j = n-1; //初始化 end,i,j
      while(end!=0 && i>=0 && j>=0){
         if(A[i]>B[j]) A[end--] = A[i--];  //从尾部开始
         else A[end--] = B[j--];
      }
     while(j>=0) A[end--] = B[j--]; // i《0,复制B
     }
};

题解二:新建空间
题解思路:最简单的一种思路,创建一个新数组存放合并后的数组,然后在拷贝到A中
复杂度分析:
时间复杂度:O((M+N))
空间复杂度:O(m+n)
实现如下

class Solution {
public:
    void merge(int A[], int m, int B[], int n) {
        int tmp[m+n];
        int i=0,j =0,k=0;
        while(i<m||j<n){
            if(i==m) tmp[k++] = B[j++];  //A数组到头
            else if(j==n) tmp[k++] = A[i++]; //B数组到头
            else tmp[k++] = A[i] > B[j] ? B[j++]  :A[i++]; //A数组 B数组选小
        }
        for(int c = 0;c<m+n;c++)
            A[c] = tmp[c];  // tmp 拷贝到A
    }
};
牛客网编程题题解 文章被收录于专栏

本专栏记录在牛客网上AC的每一题,写下题解。 未来2年完成2000编程题的题解。 2021.12.29更新,最进准备毕设,断更了,会尽快做完毕设,继续做这一件事情

全部评论
int[] arr = new int[m + n]; int i = 0, j = 0, p = 0; while (i < m && j < n) { arr[p++] = A[i] <= B[j] ? A[i++] : B[j++]; } while (i < m) { arr[p++] = A[i++]; } while (j < n) { arr[p++] = B[j++]; } A = arr; 新建一个数组arr, 为什么最后A = arr; 这样改变引用 结果返回的还是[4,5,6,0,0,0]这样的答案, debug的时候A的值已经被改掉了呀
1 回复 分享
发布于 2021-08-21 21:27
我等下看,最近有点忙
点赞 回复 分享
发布于 2021-08-21 22:21

相关推荐

头像
11-18 16:08
福州大学 Java
影流之主:干10年不被裁,我就能拿别人一年的钱了,日子有盼头了
点赞 评论 收藏
分享
牛客410815733号:这是什么电影查看图片
点赞 评论 收藏
分享
评论
16
1
分享
牛客网
牛客企业服务