合并两个有序的数组
相关题型:剑指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--]; } } };