面试题 10.01.合并排序的数组

原题链接

题解

方式一:利用额外的空间

开一个额外的空间存放数据,最后再放回去

代码如下
class Solution {
public:
    void merge(vector<int>& A, int m, vector<int>& B, int n) {
        int i = 0, j = 0; int t[1010]; int k = 0;
        while(i < m && j < n){
            if(A[i] < B[j]){
                t[k ++] = A[i ++];
            }
            else{
                t[k ++] = B[j ++];
            }
        }
        while(i < m) t[k ++] = A[i ++];
        while(j < n) t[k ++] = B[j ++];
        for(int i = 0; i < n + m; ++ i){
            A[i] = t[i];
        }
    }
};

方式二:原地逆序归并

因为题目中在A中已经开了足够的空间放在后面,可以逆序的来归并,就不需要移动了,直接在原地进行操作

代码如下
class Solution {
public:
    void merge(vector<int>& A, int m, vector<int>& B, int n) {
       //使用原地逆序归并,就不需要额外的空间了
       int i = m - 1, j = n - 1, k = m + n - 1;
       while(i >= 0 && j >= 0){
           if(A[i] < B[j]) A[k --] = B[j --];
           else A[k --] = A[i --];
       }

       while(j >= 0) A[k --] = B[j --];//因为如果是A中的数据多了,那么他的顺序就直接是好的
    }
};
posted @ 2020-07-19 14:24  Lngstart  阅读(92)  评论(0编辑  收藏  举报