这是我参与8月更文挑战的第2天,活动详情查看:8月更文挑战javascript
你们好今天给你们分享下一道 LeetCode 简单难度 的题目合并两个有序数组前端
给你两个有序整数数组 nums1 和 nums2,请你将 nums2 合并到 nums1 中,使 nums1 成为一个有序数组。java
初始化 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个都为有序数组markdown
2.num1.len = m+n网络
3.合并到num1上去app
解法ide
1.迭代oop
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;
// 由于nums1的0是占位符,能够先移除
nums1 = nums1.slice(0, m - n);
// 先迭代这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) */
复制代码
思路
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