Given two sorted integer arrays A and B, merge B into A as one sorted array.
Note:
You may assume that A has enough space (size that is greater or equal to m + n) to hold additional elements from B. The number of elements initialized in A and B are mand n respectively.
思路:
覆盖的思路,在题目remove dulplicate from sorted array中相似,在原数组上进行操作而不新建数组的情况下,在不影响原数组数据有效性的情况下,可以将操作结果覆盖到某个原数组中。本题中A在初始化m个元素后有空余空间,可以进行覆盖,所以采取从后向前比较数字并覆盖A的方法。
我原来的思路是A、B两个数组嵌套使用for循环实现遍历两个数组的方法。但是在比较的过程中,由于不确定哪一个数组的下标变化,利用嵌套for循环非常乱。所以使用了while循环,使A、B两个数组循环起来地位相同。使用while循环时需要自己操作参数a、b的增减。且通过实践发现,一个一个比较逻辑比较清晰。
最后细节注意①空集②一个已遍历完另一个还有
代码:
<span style="color:#333333;">public class Solution {
public void merge(int A[], int m, int B[], int n) {
if (m == 0) { //考虑空集情况,但实际只考虑一个为空集即可
for (int i = 0; i < B.length; i++) {
A[i] = B[i];
}
}
int a = m-1 , b = n-1;
</span><span style="color:#ff0000;">while(a >= 0 && b >= 0)</span><span style="color:#333333;">{ //一个一个判断,每一次不确定a或b减少,所以不用嵌套for循环,用while,两个a、b同时判断
if (B[b] > A[a]) {
A[a+b+1] = B[b];
</span><span style="color:#ff0000;">b--;</span><span style="color:#333333;">
}else {
A[a+b+1] = A[a];
</span><span style="color:#ff0000;">a--;</span><span style="color:#333333;">
}
}
if (b >= 0) { //b的判断条件,如果是a剩下不需要进行再移动,保持即可
for (int i = 0; i <= b; i++) {
A[i] = B[i];
}
}
}
}</span>