LeetCode精选Top面试题之合并两个有序数组

549 阅读2分钟

这是我参与更文挑战的第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的前端秘籍,我们一起学习一起进步。 觉得不错的话,也可以阅读其他文章(感谢朋友的鼓励与支持🌹🌹🌹)

开启LeetCode之旅

LeetCode之双指针

Leet27、移除元素

前端工程师必学的经典排序算法

LeetCode20、括号匹配

LeetCode7、整数反转