LeetCode-88. Merge Sorted Array

Description:

这里写图片描述

Note:

这里写图片描述

Solution(C++):

这里写图片描述

算法分析:

这道题的意思就是给出了nums1与nums2,然后给了m与n两个参数,要将nums1与nums2中的前m个与n个元素重新排序到nums1中。注意,nums1与nums2事先是已经排序好的。

那么解题思路也挺简单,就是充分利用nums1与nums2已经排序的特点,我们就是要将这m与n个元素重新排序到nums1中前m+n个中。注意一点,nums[i]就是nums中已经大于i个元素了。那么如果

nums1[i]>nums2[j]

就说明nums1[i]这个元素大于nums1中的i个元素,还大于nums2[j],从而也大于nums2中前j个元素,所以这个元素一共大于i+j+1个元素,那么就可以归位了:

nums1[i+j+1]=nums1[i]>nums2[j]?nums[i]:nums2[j];

这就是解决这道题的方法。

程序分析:

承接上面的算法分析,程序要做的是高效整洁的实施算法。既然要循环,可以采用单独的i–与j–,也可以直接“集成”一下,nums1[i–]与nums2[j–]。

 int i = m - 1, j = n - 1, tar = m + n - 1;
 while (j >= 0) {
            nums1[tar--] = i >= 0 && nums1[i] > nums2[j] ? nums1[i--] : nums2[j--];
        }

值得学习的地方有:

  1. 不管i–还是j–,其实都是i与j其中一个必-1.所以这里直接用tar=m+n-1来替代算法分析中的i+j-1.然后令tar每次循环-1,就有了nums1[tar–]。
  2. 最难解决的问题就是i–与j–如何保障在减到0后,能不变为负数。当然可以设定循环条件。但是这里厉害在将通常的while(i>=0&&j>=0)分开了。大循环条件只有j>=0,将i>=0作为三目运算条件。当i=0,条件为假,返回让j–的值,就能让i保持i=0,当j=0,循环条件破坏,就很完美。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值