思想:
简单粗暴的方法是先合并、再排序。没有技术含量。
此外,很容易想到是用归并方法。问题是对A[]从前往后赋值,会覆盖A[]中有用的数值。
模板的巧妙之处是,从后往前赋值,完美避开覆盖问题。
我看了模板的之后写的:
把数组arr1赋值给数组arr2的方法:
- for循环逐个元素复制
- copy(arr1, arr1+n, arr2);
- arr2 = arr1是不行的,因为此时arr2和arr1指向同一块内存区域,二者不是独立的,对arr2的修改将会影响到arr1。
- 对于string,str2 = str1是可以的,二者是独立的。
- 对于vector,vec2 = vec1是可以的,二者是独立的。
- 对于指针,p2 = p1,二者不是独立的。
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--;}}
};
模板的:
与我的不同之处:
- 如果A遍历完,需要把B放入A中。如果B遍历完, 不需要操作了。
- 模板采用A[p3--]=A[p1--]格式,更简洁美观。