这是我参与8月更文挑战的第2天,活动详情查看:8月更文挑战
大家好今天给大家分享下一道 LeetCode 简单难度 的题目合并两个有序数组
给你两个有序整数数组 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] 示例 2: 输入:nums1 = [1], m = 1, nums2 = [], n = 0 输出:[1]
分析
1.2个都为有序数组
2.num1.len = m+n
3.合并到num1上去
解法
1.迭代
2.sort
3.逆向双指针
解法一:迭代法
思路
1.添加一个条额外的数组res来存储值
2.迭代比较2个的大小,小的放入res中
3.如果有数组还有剩余的值 则全部放入res
4.再用res 更新nums1
*/
var merge = function (nums1, m, nums2, n) {
// 创建一个额外的数组
let res = [];
let i = 0,
j = 0;
// 先迭代这2个数组
while (i < m && j < n) {
// 比较他们的大小
if (nums1[i] <= nums2[j]) {
res.push(nums1[i++]);
} else {
res.push(nums2[j++]);
}
}
// 处理剩下的数组元素
res = res.concat(nums1.slice(i, m));
res = res.concat(nums2.slice(j, n));
for (let i = 0; i < res.length; i++) {
nums1[i] = res[i];
}
};
/* 复杂度
时间 O(n+m)
空间 O(n+m)
*/
解法二:sort
思路
1.把数组组合在一起
2.在使用sort的方式变成一个有序数组
*/
var merge = function (nums1, m, nums2, n) {
// 合并数组
for (let i = 0; i < n; i++) {
nums1[i + m] = nums2[i];
}
// 使用sort 排序
nums1.sort((a, b) => a - b);
};
/* 复杂度
时间 O((n+m)log(n+m))
空间 O(log(m+n))
*/
解法三:逆向双指针
思路
1.因为num1.len = m+n
2.因为正向比较修改nums1,当nums2比num1小的时候,会丢失Nums1的元素
3.所以采取逆向比较
*/
// 代码借鉴 https://leetcode-cn.com/problems/merge-sorted-array/solution/
var merge = function (nums1, m, nums2, n) {
let i = m - 1;
let j = n - 1;
//设置这个数组的指针
let cur = m + n - 1;
while (i >= 0 || j >= 0) {
// 说明nums1元素已经插入完了
if (i < 0) {
nums1[cur--] = nums2[j--];
// 说明nums2元素已经插入完了
} else if (j < 0) {
nums1[cur--] = nums1[i--];
} else {
// 比较大小,大的先放
if (nums1[i] >= nums2[j]) {
nums1[cur--] = nums1[i--];
} else {
nums1[cur--] = nums2[j--];
}
}
}
};
/* 复杂度
时间 O(n+m)
空间 O(1)
*/
总结
这道题考察的如果通过迭代 双指针和原生的方法来 合并升序数组
大家可以看看我分享的一个专栏(前端搞算法)里面有更多关于算法的题目的分享,希望能够帮到大家,我会尽量保持每天晚上更新,如果喜欢的麻烦帮我点个赞,十分感谢
文章内容目的在于学习讨论与分享学习算法过程中的心得体会,文中部分素材来源网络,如有侵权,请联系删除,邮箱 182450609@qq.com