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

题目:


 这道题有多种实现的思路,这里使用双指针结合数组有序的特点进行解决

思路:

m代表A初始时有效元素的个数,n代表B中元素的个数,那么n+m才是A的总长度

从A的最后一个位置开始,设为cur,分别从A和B有效元素中选取最大的一个,进行比较,将较大的放入cur,随之相应的cur--,较大元素所在数组的有效个数减1

注:在进行比较时,会出现A == B的情况,此时将等号归到A<B处,B中元素优先会使得逻辑更加简单

在最后会出现两种情况:

  • B全部加入,A有剩余

  这种情况下,不需再做修改,A总体已有序

  • A全部加入,B有剩余

  这种情况下,说明B剩下的全是小于A中现有元素,直接依次加入A中便可

代码:

class Solution {
public:
    void merge(vector<int>& A, int m, vector<int>& B, int n) {
        int cur = m+n-1;
        while(m>0 && n>0){
            if(A[m-1]>B[n-1])  A[cur--] = A[m-- -1];
            else   A[cur--] = B[n-- -1];
        }
        while(n>0){
            A[cur--] = B[n-- -1];
        }
    }
};

猜你喜欢

转载自www.cnblogs.com/ech2o/p/12401552.html