简单粗暴的方法是先合并、再排序。没有技术含量。
此外,很容易想到是用归并方法。问题是对A[]从前往后赋值,会覆盖A[]中有用的数值。
模板的巧妙之处是,从后往前赋值,完美避开覆盖问题。
把数组arr1赋值给数组arr2的方法:
class Solution {
public:
void merge(int A[], int m, int B[], int n) {
if(m == 0){
copy(B,B+n,A); // A=B不行。
return;
}
if(n == 0)
return;
int p1 = m-1;
int p2 = n-1;
int p3 = m+n-1;
while(p1 >= 0 && p2 >= 0 && p3 >= 0){
if(A[p1] > B[p2]){
A[p3] = A[p1];
p1--;
}
else{
A[p3] = B[p2];
p2--;
}
p3--;
}
//p1和p2之中,一定有且只有一个不小于0。
while(p3 >= 0 && p2 >= 0){
A[p3] = B[p2];
p2--;
p3--;
}
while(p3 >= 0 && p1 >= 0){
A[p3] = A[p1];
p1--;
p3--;
}
}
};
与我的不同之处: