欢迎来到尧图网

客户服务 关于我们

您的位置:首页 > 汽车 > 维修 > LintCode 第64题合并排序数组(简单版)

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

2025/3/28 9:59:36 来源:https://blog.csdn.net/softstarhhy/article/details/146478609  浏览:    关键词: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;

    }

}

版权声明:

本网仅为发布的内容提供存储空间,不对发表、转载的内容提供任何形式的保证。凡本网注明“来源:XXX网络”的作品,均转载自其它媒体,著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处。

我们尊重并感谢每一位作者,均已注明文章来源和作者。如因作品内容、版权或其它问题,请及时与我们联系,联系邮箱:809451989@qq.com,投稿邮箱:809451989@qq.com

热搜词