leetcode 88. 合并两个有序数组

https://leetcode-cn.com/problems/merge-sorted-array/

题目

给你两个有序整数数组 nums1 和 nums2,请你将 nums2 合并到 nums1 中,使 nums1 成为一个有序数组。

初始化 nums1 和 nums2 的元素数量分别为 m 和 n 。你可以假设 nums1 的空间大小等于 m + n,这样它就有足够的空间保存来自 nums2 的元素。

注意!修改的数组是nums1;

示例

1
2
输入:nums1 = [1,2,3,0,0,0], m = 3, nums2 = [2,5,6], n = 3
输出:[1,2,2,3,5,6]

解一:直接合并排序

语法

1
arrayObject.splice(index,howmany,item1,.....,itemX)

splice() 方法删除位于从index开始,长度为howmany的元素,并添加新项目item

1
arrayObject.sort((a, b) => a - b);

箭头函数排序,升序,降序可以改成b-a

代码

1
2
3
4
var merge = function(nums1, m, nums2, n) {
nums1.splice(m, nums1.length - m, ...nums2);
nums1.sort((a, b) => a - b);
};

复杂度分析

套用快速排序的时间空间复杂度

时间复杂度 空间复杂度
$O((m+n)\log (m+n))$ $O(\log (m+n))$

解二:双指针,创建第三个数组

思路

维护两个指针分别从头到尾扫描两个数组
把较小值放到第三个数组中

代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
var merge = function(nums1, m, nums2, n) {
let p1 = 0, p2 = 0;
//新建数组
const sorted = new Array(m + n).fill(0);
var cur;
while (p1 < m || p2 < n) {
if (p1 === m) {
//num1结束,nums2补位
cur = nums2[p2++];
} else if (p2 === n) {
//num2结束,nums1补位
cur = nums1[p1++];
} else if (nums1[p1] < nums2[p2]) {
//取nums1
cur = nums1[p1++];
} else {
//取nums2
cur = nums2[p2++];
}
//因为上面做了++操作,所以这里要-1
sorted[p1 + p2 - 1] = cur;
}
//结果返回nums1
for (let i = 0; i != m + n; ++i) {
nums1[i] = sorted[i];
}
};

复杂度分析

时间复杂度 空间复杂度
$O(m+n)$ $O(m+n)$

解三:逆向双指针,直接修改nums1

思路

维护两个指针从后向前扫描两个数组
将较大者放到nums1末尾

代码

1
2
3
4
5
6
7
8
9
10
var merge = function(nums1, m, nums2, n) {
let p1 = m-1, p2 = n-1;
//新建数组
for(i=m+n-1;i>=0;i--){
if (p1<0) nums1[i]=nums2[p2--];
else if (p2<0) nums1[i]=nums1[p1--];
else if (nums1[p1]>nums2[p2]) nums1[i]=nums1[p1--];
else nums1[i]=nums2[p2--];
}
};

复杂度分析

时间复杂度 空间复杂度
$O(m+n)$ $O(1)$
------ 本文结束 ❤ 感谢你的阅读 ------
------ 版权信息 ------

本文标题:leetcode 88. 合并两个有序数组

文章作者:Lury

发布时间:2021年07月23日 - 09:25

最后更新:2022年04月09日 - 19:19

原始链接:https://luryzhu.github.io/2021/07/23/leetcode/leetcode6/

许可协议:署名-非商业性使用-禁止演绎 4.0 国际 转载请保留原文链接及作者。