有两个有序数组,合并为一个有序数组,合并两个无序数组
BM87合并两个有序数组
88.合并两个有序数组
知识点数组双指针
描述一个有序整数数组A和一个有序整数数组B,请将数组B合并到数组A中成为一个有序升序数组。
数据范围:
注意:
1.确保数组a有足够的空间存储数组b的元素,a和b中的初始元素分别是m和n,数组a的空间是m n2。不返回合并后的数组,只需将数组b的数据合并到数组a中,后台会自动打印出合并后的数组a的内容,不需要自己打印。3.数组a也在[0,m-1]的范围内排序。
示例1输入:
[4,5,6],[1,2,3]
复制返回值:
[1,2,3,4,5,6]
复制描述:
数组A是[4,5,6],数组B是[1,2,3]。后台程序会提前将数组A扩展到[4,5,6,0,0],而数组B仍然是[1,2,3],m=3,n=3,并传入函数merge。然后请学生完成。
2示例输入:
[1,2,3],[2,5,6]
复制返回值:
[1,2,2,3,5,6]
用双指针解决问题——就地解决;
因为A有足够的空间,所以I,K,J可以分别指向A[m-1],B[n-1]和A[m n-1],然后遍历I和K,比较A[i]和A[K]的大小,把交大的值放在A[J],更新I,K,J的值。
注意:
其实有一种情况是不用遍历整个数组A的,就是B全部插入A后,A还有剩余的数。在这种情况下,你可以跳出这个循环。所以代码还可以进一步优化~
代码如下:
#包含位/标准数据。h
//https://www . now coder . com/practice/89865d 4375634 fc 484 F3 a 24 b 7 Fe 65665?tpId=295 tags=title=难度=0 judge status=0 RP=0 source URL=/exam/OJ?page=1 & tab=% E7 % AE % 97% E6 % B3 % 95% E7 % AF % 87 & topic id=295
//BM87合并两个有序数组
void merge(int A[],int m,int B[],int n)
{
int left=m-1;
int right=n-1;
int I=m n-1;
while (left=0 right=0)
{
if(左=0右=0)
{
if(A[左]=B[右])
{
A[I-]=A[left-];
}
其他
{
a[I-]=B[右-];
}
}
else if (left=0)
{
A[I-]=A[left-];
}
其他
{
a[I-]=B[右-];
}
}
返回;
}下面的代码比较短~
类别解决方案
{
公共:
void merge(向量整数1,整数m,向量整数2,整数n)
{
int left=m-1;
int right=n-1;
int index=m n-1;
while(右=0)
{
if(左0 nums 2[右]=nums 1[左])
{
num S1[index-]=num S2[right-];
}
其他
{
num S1[index-]=num S1[left-];
}
}
}
};
郑重声明:本文由网友发布,不代表盛行IT的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。