【打卡】牛客网:BM87 合并两个有序的数组

思想:

简单粗暴的方法是先合并、再排序。没有技术含量。

此外,很容易想到是用归并方法。问题是对A[]从前往后赋值,会覆盖A[]中有用的数值。

模板的巧妙之处是,从后往前赋值,完美避开覆盖问题。

我看了模板的之后写的:

把数组arr1赋值给数组arr2的方法:

  1. for循环逐个元素复制
  2. copy(arr1, arr1+n, arr2);
  3. arr2 = arr1是不行的,因为此时arr2和arr1指向同一块内存区域,二者不是独立的,对arr2的修改将会影响到arr1。
    1. 对于string,str2 = str1是可以的,二者是独立的。
    2. 对于vector,vec2 = vec1是可以的,二者是独立的。
    3. 对于指针,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--;
        }
    }
};

模板的:

与我的不同之处:

  1. 如果A遍历完,需要把B放入A中。如果B遍历完, 不需要操作了。
  2. 模板采用A[p3--]=A[p1--]格式,更简洁美观。

你可能感兴趣的:(数据结构)