“ 趁着周末,继续分享算法题,这道题也是易考题之一,想必大家在很多题中可能都会有些印象,话不多说大家一起进入正题吧。”
老规矩,先看如下题目(leetcode 88题),先自己思考思考动手写一写,在第二段中我会给出相关解题步骤:
题目描述
在这里其实我会猜你用sort方法来进行求解,答案肯定是不行的。那么该如何求解呢?
首先我们应该在题目中去找关键点,在这里注意抓关键字:有序数组。一般涉及到有序数组的,我们会第一时间考虑到双指针。那么是从前往后还是从往前呢?看情况,在这里其实是都可以的。
但是需要注意的是,如果指针是从前往后的,那么由于返回nums1,我们需要改变nums1中的值,这个时候需要去克隆存储nums1中的值,需要额外的空间,即空间复杂度为O(m)。所以在这里我就不介绍从前往后的方法了,有兴趣的小伙伴可以去网上搜索看看。
接下来我就介绍从后往前的方法,首先大家先看如下所示我画的图:
思路步骤
其实总结来说就是利用从末尾向前推,大的数就填补nums1[p]的值,然后循环结束条件就是当nums2中的数字全部比较完即为结束。接下来就是放代码的时刻。
1 | /** |
其实代码还可以更简洁,但是为了方便大家看所以我没有进行简洁化。
在这里需要注意的坑:
为什么判断条件是nums1[p1] > nums2[p2]
?反过来可以吗?
答案是不行,会陷入死循环。因为循环条件是p2>=0,if条件undefined > 1或者undefined < 1虽然都是false,但是如果反着写会一直执行这句nums1[p] = nums1[p1--]
;,那么p2永远都出不去造成死循环,所需这里写判断条件很微妙,需要多注意一下。