88. 合并两个有序数组

88. 合并两个有序数组

思路1:暴力法

直接遍历合并后sort()

附上本人三年前的写法:

void merge(vector<int>& nums1, int m, vector<int>& nums2, int n) 
    {
       for(int i=m;i<m+n;i++)
       {
          nums1[i]=nums2[i-m];
       }
      sort(nums1.begin(),nums1.end());
    }

方法可行,但有些摸鱼偷懒,并且浪费了题目给出的条件“非递减”、“nums1的初始长度m + n”

题目的用意应该有两个目的:

1.不开辟额外空间,在nums1中完成结果

2.利用两个数组的有序性,边合并边排序

思路2:逆向双指针

在之前的文章有写过感悟:双指针多用于有序数组中,笔者一开始的思路有想到这方面,但没有考虑到逆向。

原地修改时,为了避免从前往后遍历导致原有数组元素被破坏掉,所以考虑逆向遍历。

在题解评论区看到了一句话,做个小摘抄:

“所有玩家都全力向前冲刺, 却不知道向后才是胜利之门。”-《头号玩家》

逆向双指针的具体思路

1.使用三个指针i,j,k

2.nums1较大时,交换1和k的数字,循环直到满足3的条件

3.nums2小于或等于时,交换k和j的数字

void merge(vector<int>& nums1, int m, vector<int>& nums2, int n) {
    int size1=m+n;
    int i=m-1;
    int j=n-1;
    int k=m+n-1;
    if(m==0)
        nums1=nums2;
    while(j>=0){
        while(i>=0&&nums1[i]>nums2[j]){
            swap(nums1[k],nums1[i]);
            i--;k--;
        }
        swap(nums1[k],nums2[j]);
        j--;k--;
    }
}

debug了两天,这个思路是在说有点绕,我是菜狗我爱暴力法,私密马赛

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值