
来源Leetcode第88题合并两个有序数组
给定两个有序整数数组 nums1 和 nums2,将 nums2 合并到 nums1 中,使得 num1 成为一个有序数组。
说明:
- 初始化 nums1 和 nums2 的元素数量分别为 m 和 n。
- 你可以假设 nums1 有足够的空间(空间大小大于或等于 m + n)来保存 nums2 中的元素。
示例:输入:
nums1 = [1,2,3,0,0,0], m = 3
nums2 = [2,5,6], n = 3输出: [1,2,2,3,5,6]
sort
最简单的想法就是将nums2数组的元素合并到nums1里,这个只用一个for循环就可以实现,最后调用系统库函数sort就可以了。
然而我万万没想到的是,系统库函数里有个arraycopy,甚至可以不用复制数组,我傻了。
源码:public static native void arraycopy(Object src, int srcPos, Object dest, int destPos,int length);
参数:
src:要复制的数组(源数组)
srcPos:复制源数组的起始位置
dest:目标数组
destPos:目标数组的下标位置
length:要复制的长度
代码如下:
1 |
class { |
官方题解采用了两种双指针的解法,分别是从前往后和从后往前。
从前往后
一般而言,对于有序数组可以通过 双指针法 达到OO(n+m)的时间复杂度。最直接的算法实现是将指针p1置为nums1的开头, p2为 nums2的开头,在每一步将最小值放入输出数组中。由于nums1 是用于输出的数组,需要将nums1中的前m个元素放在其他地方,也就需要O(m)的空间复杂度。
代码如下:
1 |
class { |
从后往前
从前往后已经取得了最优的时间复杂度O(n+m),但需要使用额外空间。这是由于在从头改变nums1的值时,需要把nums1中的元素存放在其他位置。
如果我们从结尾开始改写 nums1 的值又会如何呢?这里没有信息,因此不需要额外空间。
代码如下:
1 |
class { |




近期评论