大家好呀,这次我们来看一下这道经典例题——合并两个有序数组。
解法一:利用辅助数组
这种解法思想是一种很经典的算法思想,也是后续归并排序中的核心算法。我们先创建一个辅助数组,大小为m + n,然后定义三个指针:cur1指向nums1数组里的第一个元素,cur2指向nums2数组里的第一个元素,cur指向辅助数组中的第一个元素。我们用cur1指向的元素与cur2指向的元素作比较,把较小的放进cur中,也就是辅助数组中的第一个位置,假设cur1指向的元素比cur2指向的元素小的话,那么cur1++,cur++。再用cur1++后所指向的元素与cur2所指向的元素作比较,重复上述操作,直到把所有的元素都放入到辅助数组中,最后把辅助数组的结果覆盖到nums1数组上。代码如下:
解法二:在原有数组基础上进行合并
解法二其实是本题的最优解法,因为第一个数组的空间本来就是m + n,所以我们可以直接把最终结果放在nums1数组中。如果我们采用和解法一类似的解法的话,定义三个指针,cur1指向nums1数组的第一个元素,cur2指向nums2数组的第一个元素,cur指针放在nums1数组的首位置,但这么做会带来一个问题,在后续的比较和遍历的时候,极有可能会覆盖掉未遍历到的元素。因此,我们需要反着来遍历。让cur1指向nums1有效元素的最后一个位置,cur2指向最后一个元素,cur指向nums1的最后一个位置。如下图所示:
然后让nums1[cur1]与nums2[cur2]比较大小,将较大的那一个值赋给nums1[cur],然后--即可。
解法二的代码实现如下:
但是要注意,解法二仅仅是这道题的最优解,因为题目中的nums1数组的大小已经规定好是n+m,然而在归并排序中的算法实现中,解法一仍然是主流解法思想。
那么以上就是本篇文章的全部内容了,创作不易,如果有所收获和启发,还请不忘点赞关注多多支持 。我们下一章,链表,不见不散!