【Lintcode】合并排序数组&& 合并排序数组 II

题目描述:合并两个排序的整数数组A和B变成一个新的数组。

注意事项
你可以假设A具有足够的空间(A数组的大小大于或等于m+n)去添加B中的元素。

样例给出 A = [1, 2, 3, empty, empty], B = [4, 5]
合并之后 A 将变成 [1,2,3,4,5]

思路:既然是合并有序的数组,那么我们肯定想到一个一个去比较,如果A的第一个数大于B的第一个数,就将A整体向后移动,然后将B的第一个数插入;如果A的第一个数小于B,那么就将A向后移动,看A第二个数和B第一个数的比较,以此类推。这种思路去实现的时候很容易出现问题,比如牵扯到拷贝的问题,比如可能会产生判断问题。

还有种思想就是既然它已经是有序的,我们可以从后向前进行比较,如果最后A最后一个都比B第一个小,那么就不需要移动A,直接将B插入到A的后面,如果A的最后一个比B大,那么它也比B中其他元素大,所以将它移动到最后,接着再去比较A的倒数第二个和B倒数第一个的大小。

到这里其实思路已经很明显了,在写代码之前,我们可以先将可能出现的测试用例写出来,比如:
A={9,10,11,12,13},B={4,5,6,7}
A={},B={1,2,3,4}
A={1,2,3},B={}
A={1,2,3},B={4,5,6}

所以代码如下:

void mergeSortedArray(int A[], int m, int B[], int n) {
        // write your code here
        int pos=m+n-1;
        int i=m-1;
        int j=n-1;
        while(i>=0 && j>=0)
        {
            if(A[i]>B[j])
            {
                A[pos--]=A[i--];
            }
            else
            {
                A[pos--]=B[j--];
            }
        }


        while(j>=0)
        {
            A[pos--]=B[j--];
        }

    }

紧接着,我们对这个面试题升级。

题目描述:合并两个排序的整数数组A和B变成一个新的数组。

样例
给出A=[1,2,3,4],B=[2,4,5,6],返回 [1,2,2,3,4,4,5,6]

思路:对这个题而言,既然是返回一个新的数组,那我们从头开始比较然后插入到新数组中。当其中一个数组已经插入完,那么另外一个数组可直接插入到新数组的后面。代码如下:

vector<int> mergeSortedArray(vector<int> &A, vector<int> &B) {
        // write your code here
        vector<int> res;
        int s1=A.size();
        int s2=B.size();
        if(s1==0) return B;
        if(s2==0) return A;


        int i=0;
        int j=0;
        while(s1&&s2)
        {
            if(A[i]>B[j])
            {
                res.push_back(B[j]);
                j++;
                s2--;
            }
            else
            {
                res.push_back(A[i]);
                i++;
                s1--;
            }
        }

        if(s2==0)
        {
            while(s1)
            {
                res.push_back(A[i]);
                i++;
                s1--;
            }
        }

        if(s1==0)
        {
            while(s2)
            {
                res.push_back(B[j]);
                j++;
                s2--;
            }
        }
        return res;
    }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值