LeetCode-88. Merge Sorted Array

来源:互联网 发布:网络运营公司赚钱吗 编辑:程序博客网 时间:2024/05/17 08:14

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,循环条件破坏,就很完美。
原创粉丝点击