这是我参与更文挑战的第6天,活动详情查看: 更文挑战
前言
公众号给npy的前端秘籍
加vx👉16639199716,拉你进群嗷~❤️
今天继续学习LeetCode精选面试题,今天选择第88题进行学习与总结~
题目描述
给你两个有序整数数组 nums1 和 nums2,请你将 nums2 合并到 nums1 中,使 nums1 成为一个有序数组。
初始化 nums1 和 nums2 的元素数量分别为 m 和 n 。你可以假设 nums1 的空间大小等于 m + n,这样它就有足够的空间保存来自 nums2 的元素。
示例1
输入:nums1 = [1,2,3,0,0,0], m = 3, nums2 = [2,5,6], n = 3
输出:[1,2,2,3,5,6]
解法一
最直观的方法是先将数组num2放进数组num1的尾部,然后直接对整个数组进行排序
var merge = function(num1,m,num2,n) {
num1.splice(m,num1.length-m,...num2)
num1.sort((a,b)=>a-b)
}
//时间复杂度O((m+n)log(m+n))
//空间复杂度O(log(m+n))
解法二、双指针
方法一,没有利用数组num1和num2已经排序的性质,利用这一性质,我们可以使用双指针方法,这一方法将两个数组看作队列,每次从两个数组头部去除比较小的数字放到结果中。
var merge = function(nums1, m, nums2, n) {
let p1 = 0, p2 = 0;
const sorted = new Array(m + n).fill(0);//fill() 方法用于将一个固定值替换数组的元素。
var cur;
while (p1 < m || p2 < n) {
if (p1 === m) {
cur = nums2[p2++];
} else if (p2 === n) {
cur = nums1[p1++];
} else if (nums1[p1] < nums2[p2]) {
cur = nums1[p1++];
} else {
cur = nums2[p2++];
}
sorted[p1 + p2 - 1] = cur;
}
for (let i = 0; i != m + n; ++i) {
nums1[i] = sorted[i];
}
};
时间复杂度:O(m+n) 指针移动单调递增,最多移动 m+n次,因此时间复杂度为 O(m+n)
空间复杂度:O(m+n) 需要建立长度为 m+n 的中间数组 sorted。
总结
刷题打卡第12天,选择力扣第88题,学习了合并两个有序数组,一起加油哇~
❤️ 感谢大家
如果你觉得这篇内容对你挺有有帮助的话: 点赞支持下吧,让更多的人也能看到这篇内容(收藏不点赞,都是耍流氓 -_-)关注公众号给npy的前端秘籍,我们一起学习一起进步。 觉得不错的话,也可以阅读其他文章(感谢朋友的鼓励与支持🌹🌹🌹)