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

合并两个有序的数组

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

相关推荐

牛客963010790号:一般是hr拿着老板账号在招人不是真是老板招
点赞 评论 收藏
分享
03-28 14:34
中南大学 Java
网易互娱明天的笔试是在一天之内任意选时间作答,那不就等于说可以抄答案?那为什么要发笔试?美团也说不拿笔试卡人,那为什么要发笔试?觉得学生们很有时间是吗?&nbsp;还有那些笔试全A了没有进面的,笔试的意义到底在哪里?
no_work_no_life:网易互娱的笔试本来就很简单 美团的确实不按笔试刷人,但是笔试是捞人的重要依据,尤其对于双非学生……我一面的时候面试官直接说是看我笔试成绩还可以就把我捞起来了……
投递美团等公司6个岗位 >
点赞 评论 收藏
分享
评论
16
1
分享

创作者周榜

更多
牛客网
牛客企业服务