题解 | #合并两个有序的数组#
合并两个有序的数组
http://www.nowcoder.com/practice/89865d4375634fc484f3a24b7fe65665
/**
1.正常思路:
合并两个数组的正常操作 是:新建一个能容纳 这两个数组的 新数组
再依次遍历 两个数组,当前最小值 是谁 就取谁
再移动指针 再比较,直到一个数组取完后,把剩下的数组拼接到已有数组;
2.此题中明确要求 不返回新数组,数据合并到数组A[]中,
又 A的空间足够大,所以合并过程只能放在A中进行,
显然比较后的数组放到A数组末尾 才合理
于是:有每次比较AB数组最大数,取最大数放置于A数组末尾
一个数组取完后,剩下数组依次复制到 A数组中
若两个数组处理完之后,A数组还有剩余空间未被填充,则移动数据是的靠前
*/
public class Solution {
public void merge(int A[], int m, int B[], int n) {
int ia = m - 1;
int ib = n - 1;
int aLastIdx = A.length - 1;
// 依次处理 直到一个数组耗尽
while (ia >= 0 && ib >= 0) {
if( A[ia] >= B[ib] ) {
A[aLastIdx--] = A[ia--];
} else {
A[aLastIdx--] = B[ib--];
}
}
// A数组 未耗尽
while( ia >= 0 ) {
A[aLastIdx--] = A[ia--];
}
// B数组 未耗尽
while( ib >= 0 ) {
A[aLastIdx--] = B[ib--];
}
// 至此 AB数组 均耗尽,判断新数组A,前方是否有剩余空间
// 若AB刚好填充完 新数组A,那么,此时aLastIdx 值 为 -1
// 若有空缺则 aLastIdx >= 0
// 把最后减掉的索引加回来,则
// 若AB刚好填充完 新数组A,那么,此时aLastIdx 值 为 0
// 若有空缺则 aLastIdx > 0
aLastIdx = aLastIdx + 1;
if( aLastIdx > 0 ) {
// 数组前移动, 原有位置 重置为 0
for (int aFrontIdx = aLastIdx; aFrontIdx < A.length; aFrontIdx++ ) {
A[aFrontIdx - aLastIdx] = A[aFrontIdx];
A[aFrontIdx] = 0;
}
}
}
}
查看21道真题和解析