合并两个有序的数组

相关题型:剑指offer中的面试题5:替换空格
这类题的解题思路:
如果按照常规想法,从前向后遍历在比较合并这样会出现多从复制一个数字的情况,这样时间复杂度为O(n*n)太高。我们换一种思路,从后面往前比较A、B两个数组中的数字,并把较大的数字复制到A中合适的位置。

题目描述:

合并两个有序数组

题解:

从后面排序,将两个数组后面的值进行比较,依次排序,需要考虑的是A或者B数组大于B或者A数组的情况
需要考虑的点是:
1、如果数组A先遍历结束,则直接将数组B剩余的元素放在数组A的前面位置即可。
2、如果数组B先遍历结束,则直接结束即可。

代码

class Solution {
public:
    void merge(int A[], int m, int B[], int n) {
   // i表示数组A的末尾、j表示数组B的末尾、m表示数组A的长度、n表示数组B的长度
//显然合并之后的 数组A的长度为 m+n 数组A[0   m+n-1]
        int i = m-1, j= n-1, s= n+m-1;

        while(i>=0 && j>=0){

            A[s--] = A[i] > B[j] ? A[i--] : B[j--]; //三目运算符,用于比较两个数组的元素大小

        }
         while(i>=0){//

            A[s--] = A[i--];//如果数组B先遍历结束,则直接结束即可。
        }
        while(j>=0){//如果数组A先遍历结束,则直接将数组B剩余的元素放在数组A的前面位置即可。

            A[s--] = B[j--];
        }

    }
};