【牛客刷题-算法】NC22 合并两个有序的数组

简介: 【牛客刷题-算法】NC22 合并两个有序的数组

1.题目描述


描述

给出一个有序的整数数组 A 和有序的整数数组 B ,请将数组 B 合并到数组 A 中,变成一个有序的升序数组


数据范围:

image.png


注意:


保证 A 数组有足够的空间存放 B 数组的元素, A 和 B 中初始的元素数目分别为 m 和 n,A的数组空间大小为 m+n

不要返回合并的数组,将数组 B 的数据合并到 A 里面就好了,且后台会自动将合并后的数组 A 的内容打印出来,所以也不需要自己打印

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


2.算法设计思路


1)归并到一个新数组C中

定义三个指针a , b , c a,b,ca,b,c分别指向A , B , C A,B,CA,B,C的开头,比较a 、 b a、ba、b指向的元素,若A [ a ] < B [ b ] A[a]<B[b]A[a]<B[b]则将A [ a ] A[a]A[a]放入C CC中,否则将B [ b ] B[b]B[b]放入C CC中,直到A , B A,BA,B中有一个数组为空,或者都为空。


然后将有剩余元素的数组中的元素转移到C中。


最后将C复制到A中即可。


2)将A复制到C,再归并到A中

减少了部分的

时间开销:从需要复制m+n个元素,到只需复制m个元素

空间开销:C需要的空间从m+n变为了m


3)直接在A中操作

前面的两种思路,都是从小的元素开始归并,为了避免覆盖原来A中的元素,我们才需要新开一个数组C来中转。


但是要注意到A数组的尾部是空的,我们不妨先从大的元素开始归并,就可以放到A的末尾。


这个思路我当时也没有想到,是看了别人的题解,其中还仔细解释了为何不会导致覆盖。可以参考原文:题解 | #合并两个有序的数组#。


3.算法实现


注:这里并不是完整代码,而只是核心代码的模式


下面是思路二的代码:


class Solution {
public:
    void merge(int A[], int m, int B[], int n) {
        int* C = new int[m];
        for(int i = 0; i < m; i++){
            C[i] = A[i];
        }
        int a = 0, b = 0, c = 0;
        while(c < m && b < n){
            A[a++] = C[c] < B[b] ? C[c++] : B[b++];
        }
        while(c < m){
            A[a++] = C[c++];
        }
        while(b < n){
            A[a++] = B[b++];
        }
    }
};

4.运行结果


成功通过!

image.png


相关文章
|
1天前
|
存储 算法
数据结构与算法②(复杂度相关OJ)(六道数组OJ题)(下)
数据结构与算法②(复杂度相关OJ)(六道数组OJ题)
6 0
|
1天前
|
存储 算法 C语言
数据结构与算法②(复杂度相关OJ)(六道数组OJ题)(上)
数据结构与算法②(复杂度相关OJ)(六道数组OJ题)
18 2
|
3天前
|
算法 搜索推荐 Java
滚雪球学Java(33):数组算法大揭秘:应用案例实战分享
【5月更文挑战第8天】🏆本文收录于「滚雪球学Java」专栏,专业攻坚指数级提升,希望能够助你一臂之力,帮你早日登顶实现财富自由🚀;同时,欢迎大家关注&&收藏&&订阅!持续更新中,up!up!up!!
31 8
滚雪球学Java(33):数组算法大揭秘:应用案例实战分享
|
7天前
|
搜索推荐 算法 Java
滚雪球学Java(29):数组长度和排序算法:让你的程序更高效
【5月更文挑战第4天】🏆本文收录于「滚雪球学Java」专栏,专业攻坚指数级提升,希望能够助你一臂之力,帮你早日登顶实现财富自由🚀;同时,欢迎大家关注&&收藏&&订阅!持续更新中,up!up!up!!
13 0
滚雪球学Java(29):数组长度和排序算法:让你的程序更高效
|
7天前
|
存储 算法 容器
算法刷题小技巧【持续补充~】
算法刷题小技巧【持续补充~】
9 2
|
7天前
|
存储 算法 Java
数据结构与算法 数组和链表
数据结构与算法 数组和链表
12 0
|
7天前
|
算法 安全 定位技术
【刷题】备战蓝桥杯 — dfs 算法
dfs算法在数据较小的情况下可以使用。 一定一定要确定好终止条件,避免栈溢出。 相应做好回溯,保证每次的遍历都是不一样的选择,避免少结果。 针对题目进行对应细节处理,有能力的话可以进行剪枝优化!!!
14 0
|
7天前
|
机器学习/深度学习 算法 数据安全/隐私保护
基于有序抖动块截断编码的水印嵌入和提取算法matlab仿真
这是一个关于数字图像水印嵌入的算法介绍。使用MATLAB2022a,该算法基于DOTC,结合抖动和量化误差隐藏,确保水印的鲁棒性和隐蔽性。图像被分为N*N块,根据水印信号进行二值化处理,通过调整重建电平的奇偶性嵌入水印。水印提取是嵌入过程的逆操作,通过重建电平恢复隐藏的水印比特。提供的代码片段展示了从块处理、水印嵌入到噪声攻击模拟及水印提取的过程,还包括PSNR和NC的计算,用于评估水印在不同噪声水平下的性能。
|
7天前
|
算法 数据安全/隐私保护 计算机视觉
基于二维CS-SCHT变换和LABS方法的水印嵌入和提取算法matlab仿真
该内容包括一个算法的运行展示和详细步骤,使用了MATLAB2022a。算法涉及水印嵌入和提取,利用LAB色彩空间可能用于隐藏水印。水印通过二维CS-SCHT变换、低频系数处理和特定解码策略来提取。代码段展示了水印置乱、图像处理(如噪声、旋转、剪切等攻击)以及水印的逆置乱和提取过程。最后,计算并保存了比特率,用于评估水印的稳健性。
|
3天前
|
算法
m基于BP译码算法的LDPC编译码matlab误码率仿真,对比不同的码长
MATLAB 2022a仿真实现了LDPC码的性能分析,展示了不同码长对纠错能力的影响。短码长LDPC码收敛快但纠错能力有限,长码长则提供更强纠错能力但易陷入局部最优。核心代码通过循环进行误码率仿真,根据EsN0计算误比特率,并保存不同码长(12-768)的结果数据。
22 9
m基于BP译码算法的LDPC编译码matlab误码率仿真,对比不同的码长