【面试经典150题】合并两个有序数组-JS版

题目来源

初始思路:同时循环遍历两个数组,选出较小元素放入新数组。剩下一个没有被遍历完的数组的剩余元素直接拼接到新数组后。

错误示例

javascript 复制代码
var merge = function (nums1, m, nums2, n) {
    let i = 0,
        j = 0,
        nums3 = [];
    while (i < m && j < n) {
        if (nums1[i] <= nums2[j]) {
            nums3.push(nums1[i++]);
        } else {
            nums3.push(nums2[j++]);
        }
    }
    if (i < m) {
        nums3 = nums3.concat(nums1.slice(i, m));
    }
    if (j < n) {
        nums3 = nums3.concat(nums2.slice(j, n));
    }
    nums1 = nums3;
};

nums1 = nums3 不会改变原数组,这样做只是改变了参数nums1 指向了nums3的内容,但是原nums1内容并没有改变。


正确示例1

javascript 复制代码
var merge = function (nums1, m, nums2, n) {
    let i = 0,
        j = 0,
        nums3 = [];
    while (i < m && j < n) {
        if (nums1[i] <= nums2[j]) {
            nums3.push(nums1[i++]);
        } else {
            nums3.push(nums2[j++]);
        }
    }
    if (i < m) {
        nums3 = nums3.concat(nums1.slice(i, m));
    }
    if (j < n) {
        nums3 = nums3.concat(nums2.slice(j, n));
    }
    for (let i = 0; i < nums1.length; i++) {
        nums1[i] = nums3[i];
    }
    //nums1.splice(0, nums1.length, ...nums3);
};

直接改变nums1对应的区域的值。

++注意使用splice方法会有一定的空间损耗++。

时间复杂度 : O ( m + n ) O(m+n) O(m+n)。

空间复杂度 : O ( m + n ) O(m+n) O(m+n)。

正确示例1可以优化的地方:辅助数组nums3可以不用,我们从后往前遍历,依次选择较大的填入nums1。


正确示例2省去nums3数组

javascript 复制代码
var merge = function(nums1, m, nums2, n){
    let i = m - 1, j = n - 1, k = m + n - 1;
    while(i>=0&&j>=0){
        if(nums1[i]>nums2[j]){
            nums1[k--]=nums1[i--];
        }else{
            nums1[k--]=nums2[j--];
        }
    }
    while(j>=0){
        nums1[k--]=nums2[j--];
    }
    // nums1.splice(0,j+1,...nums2.slice(0,j+1));
}

时间复杂度 : O ( m + n ) O(m+n) O(m+n)

空间复杂度 : O ( 1 ) O(1) O(1)

小伙伴们有更好的解法吗?

相关推荐
专注VB编程开发20年14 分钟前
VB.NET多线程排序算法实现:LINQ与正则表达式方法
排序算法·.net·linq
渣哥42 分钟前
当容器里有多个 Bean,@Qualifier 如何精准定位?
javascript·后端·面试
前端拿破轮2 小时前
从0到1搭一个monorepo项目(二)
前端·javascript·面试
ssshooter3 小时前
MCP 服务 Streamable HTTP 和 SSE 的区别
人工智能·面试·程序员
DIY机器人工房4 小时前
【嵌入式面试题】STM32F103C8T6 完整元器件解析 + 面试问题答案
stm32·单片机·面试·嵌入式·面试题·diy机器人工房
晴殇i4 小时前
前端鉴权新时代:告别 localStorage,拥抱更安全的 JWT 存储方案
前端·javascript·面试
来旺4 小时前
互联网大厂Java面试全解析及三轮问答专项
java·数据库·spring boot·安全·缓存·微服务·面试
小奋斗4 小时前
面试官:[1] == '1'和[1] == 1结果是什么?
前端·面试
聪明的笨猪猪6 小时前
Java JVM “类加载与虚拟机执行” 面试清单(含超通俗生活案例与深度理解)
java·经验分享·笔记·面试
玩镜的码农小师兄7 小时前
[从零开始面试算法] (04/100) LeetCode 136. 只出现一次的数字:哈希表与位运算的巅峰对决
c++·算法·leetcode·面试·位运算·hot100