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--];
}
值得学习的地方有:
- 不管i–还是j–,其实都是i与j其中一个必-1.所以这里直接用tar=m+n-1来替代算法分析中的i+j-1.然后令tar每次循环-1,就有了nums1[tar–]。
- 最难解决的问题就是i–与j–如何保障在减到0后,能不变为负数。当然可以设定循环条件。但是这里厉害在将通常的while(i>=0&&j>=0)分开了。大循环条件只有j>=0,将i>=0作为三目运算条件。当i=0,条件为假,返回让j–的值,就能让i保持i=0,当j=0,循环条件破坏,就很完美。