2. 合并两个有序数组

2023-11-17

2.合并两个有序数组

题目描述

给你两个按 非递减顺序 排列的整数数组 nums1 和 nums2,另有两个整数 m 和 n ,分别表示 nums1 和 nums2 中的元素数目。
请你 合并 nums2 到 nums1 中,使合并后的数组同样按 非递减顺序 排列。
注意:最终,合并后数组不应由函数返回,而是存储在数组 nums1 中。为了应对这种情况,nums1 的初始长度为 m + n,其中前 m 个元素表示应合并的元素,后 n 个元素为 0 ,应忽略。nums2 的长度为 n 。

解题思路

解法一:双指针法
思路:
时间复杂度:O(n)
空间复杂度:O(m+n)=O(n)
解法二:直接合并后排序法
思路:直接将两个数组合并,然后再对合并后的数组进行排序
时间复杂度:平均情况O((m+n)log(m+n))
空间复杂度:平均情况O(log(m+n))
解法三:逆向双指针法
思路:从后往前对两个数组进行遍历比较,然后将较大的嵌入的nums1的后面
时间复杂度:O(m+n)
空间复杂度:O(l)

代码

解法一:双指针法(写的点冗余)

   public static void merge(int[] nums1, int m, int[] nums2, int n) {
         int[] arr=new int[m+n];
         int i=0;
         int j=0;
         int r=0;
         if(m!=0 && n!=0){
             while(i<m && j<n){
                     if((nums1[i]<=nums2[j])){
                         arr[r]=nums1[i];
                         r++;
                         i++;
                     }else{
                         arr[r]=nums2[j];
                         r++;
                         j++;
                     }
                 }
             if(i<m){
                 for(;i<m;i++)
                     arr[r++]=nums1[i];
             }
             if(j<n){
                for (;j<n;j++)
                    arr[r++]=nums2[j];
             }
             for(int x=0;x<m+n;x++){
                 nums1[x]=arr[x];
             }
         }else if (m==0 && n!=0){
             for (int c=0;c<n;c++)
                 nums1[c]=nums2[c];
         }else{
         }
    }

解法二:直接合并后排序法

    public static void merge2(int[] nums1, int m, int[] nums2, int n) {

        for(int i=0;i<n;i++)
            nums1[m+i]=nums2[i];
        Arrays.sort(nums1);
    }

解法三:逆向双指针法

    public static void merge3(int[] nums1, int m, int[] nums2, int n) {
       int p1 = m - 1, p2 = n - 1;
       int tail = m + n - 1;
       int cur;
       while (p1 >= 0 || p2 >= 0) {
           if (p1 == -1) {
               cur = nums2[p2--];
           } else if (p2 == -1) {
               cur = nums1[p1--];
           } else if (nums1[p1] > nums2[p2]) {
               cur = nums1[p1--];
           } else {
               cur = nums2[p2--];
           }
           nums1[tail--] = cur;
       }

   }   

来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/merge-sorted-array

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

2. 合并两个有序数组 的相关文章

随机推荐

  • C#关键字 abstract,override,virtual的用法

    什么是抽象类 abstract关键字修饰的类称为抽象类 抽象类不能被实例化 抽象类是派生类的基类 关键字 abstract 语法 public abstract class 类名 1 一个抽象类可以同时包含抽象方法和非抽象方法 但不能实例化
  • IDEA工具快捷键---补全返回值

    Ctrl alt v 自动提示
  • 接口测试开发之:一篇搞懂 Cache、Cookie及Session的爱恨情仇

    Cashe Cookie与Session 1 引言 2 Cache 2 1 缓存定义 2 1 1 缓存概念 2 1 2 缓存优点 2 2 浏览器缓存 2 2 1 存储路径 2 2 2 缓存优点 2 2 3 缓存弊端 2 2 4 原理图 2
  • 【习题三】【数据库原理】

    文章目录 一 单选题 二 填空题 一 单选题 1 X Y能从推理规则导出的充分必要条件是 正确答案 B 2 设有关系模式R A B C D E 函数依赖集F A B B C C D D A AB BC AD 是R上的一个分解 那么分解 相对
  • [1143]Flink的Checkpoint和Savepoint

    文章目录 Flink的Checkpoint和Savepoint介绍 第一部分 Flink的Checkpoint 1 Flink Checkpoint原理介绍 2 Checkpoint的简单设置 3 保存多个Checkpoint 4 从Che
  • C++面试题(四)——智能指针的原理和实现

    C 面试题 一 二 和 三 都搞定的话 恭喜你来到这里 这基本就是c 面试题的最后一波了 1 你知道智能指针吗 智能指针的原理 2 常用的智能指针 3 智能指针的实现 1答案 智能指针是一个类 这个类的构造函数中传入一个普通指针 析构函数中
  • vimium使用

    vimium使用 2019 03 07 22 16 by 轩脉刃 阅读 评论 收藏 编辑 vimium使用 chrome下面的vimium插件已经慕名已久 迟迟没有做尝试 今天在家有空就熟悉了一下vimium 感觉还是棒棒的 记录一下一些使
  • 《面试准备》中兴2018笔试题

    include
  • 论文阅读 AutoML: A Survey of the State-of-the-Art

    论文阅读 AutoML A Survey of the State of the Art 摘要 略 简介 从两个角度介绍NAS 首先是模型的结构 常见的结构包括整体结构 基于单元的结构 层次结构和基于态射的结构等 其次是模型的超参数优化 H
  • Java序列化

    Java序列化 Java 提供了一种对象序列化的机制 该机制中 一个对象可以被表示为一个字节序列 该字节序列包括该对象的数据 有关对象的类型的信息和存储在对象中数据的类型 将序列化对象写入文件之后 可以从文件中读取出来 并且对它进行反序列化
  • 智慧监控vue实现的新型冠状病毒肺炎疫情可视化统计分析大屏前端案例

    2020年春节前后 新型冠状病毒肺炎疫情的消息牵动着全国人民的心 大家都非常关注疫情的变化和发展 非常关注疫情 在春节期间 针对疫情的发展变化集合在我们的专门的网页 实现一个可视化统计分析大屏前端 基于Vue技术实现 基于此项目可以做一些调
  • 基于MATLAB实现图像处理常用应用案例(附上100个仿真源码+数据)

    MATLAB是一款功能强大的图像处理软件 可以用于实现各种常见的图像处理应用 下面将介绍几个常见的图像处理应用案例 文章目录 1 图像去噪 2 图像增强 3 图像分割 4 特征提取 5 图像拼接 6 完整源码 数据下载 1 图像去噪 图像去
  • 通过Wireshark抓包疯狂聊天程序聊天记录

    文章目录 一 WireShark 简介 二 抓取聊天网络数据包 1 设备连接 2 使用wireshark进行抓包 3 测试分析 三 总结 四 参考链接 一 WireShark 简介 Wireshark是一个网络封包分析软件 网络封包分析软件
  • SQL Server 数据库增删改查

    一开始我们先讲一下 今给大家带来的是SQL Server 数据库的增删改查 我吗先了解一下里面要用到的方法 增加 insert 增加 into 到 values 值 删除 delete 删除 where条件 修改 update 修改 set
  • 【Android Studio】解决Android SDK -(unavailable)和Target folder is neither...问题

    1 JDK 是从 oracle 官网下载的 配置 Android Studio 选择 jdk 时指向对应目录 注意不是选择 Android Studio 内部的jre目录 而是选择另外下载的 JDK 的目录 2 图示问题出现时 选择目录要在
  • 关于压力测试的思路

    思路 把压力测试 SQL优化 MEMCACHED优化 SQL压力测试等进行模拟样例测试 并形成一系列办法 为以后可能出现的情况准备我们的知识储备 当然 就目前而言我们的小系统不需要这样的那样的优化 可能只能提升不到一毫秒 但我们是在整理办法
  • Spring Cloud 使用 @RefreshScope 注解配置动态刷新

    一 RefreshScope动态刷新原理 在SpringIOC中 BeanScope Bean的作用域 影响了Bean的管理方式 Bean的作用域 例如创建Scope singleton的Bean时 IOC会保存实例在一个Map中 保证这个
  • Windows下编译caffe

    Windows下编译caffe 最近在windows上重新部署了下caffe 发现微软对提供的caffe做了很多改进 解决了很多编译配置的bug 程序下载caffe依赖包NugetPackages和编译速度也快了很多 现在上手caffe算是
  • QT设置引用路径问题

    在Linux中添加动态库路径可以设置LD LIBRARY PATH路径 如添加 mylib动态库路径 export LD LIBRARY PATH mylib LD LIBRARY PATH 除了上面方法外 我们还可以使用编译参数 Wl r
  • 2. 合并两个有序数组

    2 合并两个有序数组 题目描述 解题思路 代码 题目描述 给你两个按 非递减顺序 排列的整数数组 nums1 和 nums2 另有两个整数 m 和 n 分别表示 nums1 和 nums2 中的元素数目 请你 合并 nums2 到 nums