Leetcode每日一题:88.merge-sorted-array(合并两个有序数组)

在这里插入图片描述
思路:最容易想到的就是归并排序的归并策略了,时间复杂度O(m+n),空间复杂度O(n);但是官网给出了另一个难以想到的妙招,就是反向归并,因为nums1最后面的n个元素是空的,所以从后端开始归并,每次选择较大的放入nums1的最后面;
在这里插入图片描述
奇怪的是,明明空间复杂度差了O(m),但为什么跑出来结果差不多呢?

void merge(vector<int> &nums1, int m, vector<int> &nums2, int n)
    {
        vector<int> a(m,0);
        int i = 0, j = 0;
        int index = 0;

        for (int k = 0; k < m; k++)
        {
            a[k] = nums1[k];
        }
        while (i < m && j < n)
        {
            if (a[i] < nums2[j])
            {
                nums1[index++] = a[i++];
            }
            else
            {
                nums1[index++] = nums2[j++];
            }
        }
        while (i < m)
        {
            nums1[index++]=a[i++];
        }
        while(j<n)
        {
            nums1[index++]=nums2[j++];
        }
    }
void merge(vector<int> &nums1, int m, vector<int> &nums2, int n)
    {
        int i = m-1, j = n-1;
        int index = m + n - 1;
        while (i >= 0 && j >= 0)
        {
            if (nums1[i]<nums2[j])
            {
                nums1[index--]=nums2[j--];
            }
            else
            {
                nums1[index--]=nums1[i--];
            }
            
        }
        while(i>=0)
        {
            nums1[index--]=nums1[i--];
        }
        while(j>=0)
        {
            nums1[index--]=nums2[j--];
        }
    }
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值