NC22 合并两个有序的数组

描述

给出一个整数数组A和有序的整数数组B,请将数组A合并到数组B中,变成一个有序的升序数组
注意:
1.可以假设A数组有足够的空间存放B数组的元素,A和B中初始的元素数目分别为m和n,A的数组空间大小为 m+n

2.不要返回合并的数组,返回是空的,将数组B的数据合并到A里面就好了

3.A数组在[0,m-1]的范围也是有序的

例1:

A: [1,2,3,0,0,0],m=3

B: [2,5,6],n=3

合并过后A为:

A: [1,2,2,3,5,6]

分析:

因为限制空间复杂度,要求要在A数组上进行操作,可以选择逆序合并,不会覆盖A数组的数据。

逆序:

    public void merge(int A[], int m, int B[], int n) {
         //因为题目明确说了A数组足够大,所以直接在A数组操作
        int i = m - 1;
        int j = n - 1;
        int index = m + n - 1;//AB合并后最后一个元素所在位置
        while(i >= 0 && j >= 0)//AB合并,谁大就先放谁
            A[index --] = A[i] > B[j] ? A[i --] : B[j --];
        while(j >= 0)//如果B没有遍历完,那么之间丢在A数组里面
            A[index --] = B[j --];
 
    }

提交结果:答案正确 运行时间:22ms 占用内存:9656KB 使用语言:Java 用例通过率:100.00% 

顺序: 

 public void merge(int A[], int m, int B[], int n) {
        int i = 0,j = 0,k = 0;
        int[] C = new int[m+n];
        while(i < m+n&&j < n&&k < m){
            C[i++] = A[k]<B[j]?A[k++]:B[j++];
        }
        if(j != n||n == 1)
            for(;j<n;j++)
                C[i++] = B[j];
        if(k != m||m == 1)
            for(;k<m;k++)
                C[i++] = A[k];
        for(i = 0;i < m+n;i++)
            A[i] = C[i];
    }

提交结果:答案正确 运行时间:19ms 占用内存:9764KB 使用语言:Java 用例通过率:100.00%

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值