✨✨✨学习的道路很枯燥,希望我们能并肩走下来!
编程真是一件很奇妙的东西。你只是浅尝辄止,那么只会觉得枯燥乏味,像对待任务似的应付它。但你如果深入探索,就会发现其中的奇妙,了解许多所不知道的原理。知识的力量让你沉醉,甘愿深陷其中并发现宝藏。
1. 题目描述
给出一个有序的整数数组 A 和有序的整数数组 B ,请将数组 B 合并到数组 A 中,变成一个有序的升序数组
题目要求:
1.保证 A 数组有足够的空间存放 B 数组的元素, A 和 B 中初始的元素数目分别为 m 和 n,A的数组空间大小为 m+n
2.不要返回合并的数组,将数组 B 的数据合并到 A 里面就好了,且后台会自动将合并后的数组 A 的内容打印出来,所以也不需要自己打印
3. A 数组在[0,m-1]的范围也是有序的
示例
输入:
[1,2,3],[2,5,6]
返回值:
[1,2,2,3,5,6]
2. 题目解读
数组A有m个元素,数组B中有个元素,数组A中有足够的空间(m+n)存放两个数组合并后的元素,但是合并后的数组A是有序的。
【注】不要使用sort函数,自己实现方法合并数组。
3. 思路
①方式一:直接把B数组存放到A数组后面,再利用Sort函数进行排序即可;但这样只是取巧的方式,我们需要一些简单的思想算法来进行解题。- (不推荐,如果实在做不出来,可以临时使用)
②方式二:定义三个变量,来记录数组下标;因为数组都是有序的,需要从数组末尾下标进行操作,把较大的数排在后面;定义数组A下标pa = m-1,数组B下标pb = n-1,定义k下标来存放pa与pb下标比较后较大的值 k = m+n-1;
两数组中元素比较涉及循环,循环结束有两种结果:数组A结束 或 数组B结束
– ① 数组B结束,对结果没有影响,数组A是有序的;(只有数组B中的数大于数组A中的数,才可能放入A中,所以只要是数组B结束的A中一定是有序的)
– ②数组A结束,说明数组B中还有元素,因为数组是有序的,所以需要把数组B中剩余的元素根据下标依次插入到数组A中即可;
图示起始位置:
循环条件控制示例图:
4. 代码实现
代码实现具体操作:
① 想到用三种下标实现pa,pb,k
② 找到循环条件pa >= 0 && pb >= 0
③ 比较pa与pb下标在数组中对应的元素,大的元素放在数组A中的k位置;(比较完记得下标移动,谁数大,谁下标-1)
④ 单独处理数组A先走完,数组B中还有剩余的情况
public void merge(int A[], int m, int B[], int n) {
int pa = m - 1;
int pb = n - 1;
int k = m + n - 1;
while (pa >= 0 && pb >= 0) {
if(A[pa] < B[pb]) {//数组B中的元素大,就讲B的元素放到数组A中的k位置
A[k] = B[pb];
pb--;//数组B下标-1
k--;//k位置-1
} else {
A[k] = A[pa];
pa--;//数组A下标-1
k--;//k位置-1
}
}
//处理数组A先走完,数组B中还有剩余的情况
while(pb >= 0) {
A[k] = B[pb];
pb--;
k--;
}
}
总结
✨✨✨各位读友,本篇分享到内容如果对你有帮助给个👍赞鼓励一下吧!!
感谢每一位一起走到这的伙伴,我们可以一起交流进步!!!一起加油吧!!!