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 to hold additional elements from B. The number of elements initialized in A and B are m and n respectively.
假设A = [2, 3, 4, 5] B = [1, 1]
如果顺序合并,
A[0] > B[0] ,将A往后移动一个,B[0]加入 => A = [1, 2, 3, 4, 5];
A[1] > B[1], 将A往后移动一个,B[1]加入 => A = [1, 1, 2, 3, 4, 5]。
当B[i] < A[j]时,A都要移动整个数组,这种做法复杂度将为O(n^2)。
不妨考虑倒着合并,
A[3] > B[1],所以A[5] = A[3] => A = [2, 3, 4, 5, x, 5]
A[2] > B[1],所以A = [2, 3, 4, 5, 4, 5]
...
这种做法复杂度为O(n)。
class Solution {
public:
void merge(int A[], int m, int B[], int n) {
// Start typing your C/C++ solution below
// DO NOT write int main() function
int idxA = m - 1, idxB = n - 1;
for (int i = m + n - 1; i >= 0; i--) {
if (idxA == -1 || (idxB != -1 && A[idxA] <= B[idxB])) {
A[i] = B[idxB--];
}
else {
A[i] = A[idxA--];
}
}
}
};