LintCode 第64题合并排序数组(简单版)

描述

合并两个排序的整数数组 A 和 B 变成一个新的数组。
原地修改数组 A 把数组 B 合并到数组 A 的后面。

样例 1:

输入:

A = [1,2,3]
m = 3
B = [4,5]
n = 2

输出:

[1,2,3,4,5]

解释:

经过合并新的数组为[1,2,3,4,5]
样例 2:

输入:

A = [1,2,5]
m = 3
B = [3,4]
n = 2

输出:

[1,2,3,4,5]

解释:

经过合并新的数组为[1,2,3,4,5]

思路:题目中要求原地排序,则不能从新建一个数组用来记录A数组和B数组的比值并写入

应该采用双指针,从后往前原地合并

1.设置三个指针:

指针说明
rightA = m - 1指向 A 有效部分的最后一个元素
rightB = n - 1指向 B 的最后一个元素
totalRight = m + n - 1

指向 A 的最末尾(即最终要放入数据的位置)

2.从后往前比较 A 和 B 的元素:

每次从 A[rightA]B[rightB] 中选出较大的放到 A[totalRight]

比较完之后,移动对应的指针和 totalRight

这样可以确保最大值先放到最右边,避免覆盖 A 的已有值

3.如果 B 还有剩余,继续把 B 的元素复制到 A 的前面;

A 剩下的不用管,因为已经在合适位置上。

代码如下:

public class Solution {

    public int[] mergeSortedArray(int[] A, int m, int[] B, int n) {

        int rightA=m-1;

        int rightB=n-1;

        int totalright=m+n-1;

        while(rightA>=0&&rightB>=0&&totalright>=0)

        {

            if(A[rightA]>=B[rightB])

            {

                A[totalright--]=A[rightA--];

            }else

            {

             A[totalright--]=B[rightB--];

            }

        }

        while(rightA>=0&&totalright>=0)

        {

             A[totalright--]=A[rightA--];

        }

        while(rightB>=0&&totalright>=0)

        {

             A[totalright--]=B[rightB--];

        }

        return A;

    }

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值