※ Leetcode - Array - 88. Merge Sorted Array(快速归并两个有序数组)

1. Problem Description

Given two sorted integer arrays nums1 and nums2, merge nums2 into nums1 as one sorted array.

 

Note:

You may assume that nums1 has enough space (size that is greater or equal to m + n) to hold additional elements from nums2. The number of elements initialized in nums1 and nums2 are m and n respectively.

 

高效归并两个有序数组。

2. My solution1 (另开空间从前往后)

从前往后合并,用两个指针分被指向两个数组当前最小元素,需要另开辟一个数组。

    void merge(vector<int>& nums1, int m, vector<int>& nums2, int n)
    {
        int It1=0,It2=0,It=0;
        vector<int>res;
        while(It<m+n)
        {
            if(It1<m&&It2<n)
            {
                if(nums1[It1]<=nums2[It2])
                    res.push_back(nums1[It1++]);
                else
                    res.push_back(nums2[It2++]);
                It++;
            }
            if(It1>=m)
            {
                while(It2<n)
                    res.push_back(nums2[It2++]),It++;
                break;
            }
            if(It2>=n)
            {
                while(It1<m)
                  res.push_back(nums1[It1++]),It++;
                break;
            }
        }
        nums1.clear();
        for(int i=0; i<m+n; i++)
            nums1.push_back(res[i]);
        res.clear();
    }

3. My solution2in place归并,从后往前)

PS

有一组样例是

nums1={0},m=0;

nums2={1],n=1.

    void merge(vector<int>& nums1, int m, vector<int>& nums2, int n)
    {
        int It1=m-1,It2=n-1,It=m+n-1;
        for(int i=0; i<n+m-nums1.size(); i++)//z1!!!!!样例中存在m比实际size小的情况!!!!!
            nums1.push_back(0);
        while(It>=0)
        {
            if(It1>=0&&It2>=0)
            {
 
                if(nums1[It1]>=nums2[It2])
                    nums1[It--]=nums1[It1--];
                else
                    nums1[It--]=nums2[It2--];
            }
            else if(It1<0)
            {
                while(It2>=0)
                    nums1[It--]=nums2[It2--];
                break;
            }
            else
            {
                while(It1>=0)
                    nums1[It--]=nums1[It1--];
                break;
            }
        }
    }


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值