Leetcode 88:合并两个有序数组

2023-11-02

题目描述:

给你两个按 非递减顺序 排列的整数数组 nums1 和 nums2,另有两个整数 m 和 n ,分别表示 nums1 和 nums2 中的元素数目。

请你 合并 nums2 到 nums1 中,使合并后的数组同样按 非递减顺序 排列。

注意:最终,合并后数组不应由函数返回,而是存储在数组 nums1 中。为了应对这种情况,nums1 的初始长度为 m + n,其中前 m 个元素表示应合并的元素,后 n 个元素为 0 ,应忽略。nums2 的长度为 n 。

示例 1:

输入:nums1 = [1,2,3,0,0,0], m = 3, nums2 = [2,5,6], n = 3

输出:[1,2,2,3,5,6]

解释:需要合并 [1,2,3] 和 [2,5,6] 。合并结果是 [1,2,2,3,5,6] ,其中斜体加粗标注的为 nums1 中的元素。

示例 2:

输入:nums1 = [1], m = 1, nums2 = [], n = 0

输出:[1]

解释:需要合并 [1] 和 [] 。合并结果是 [1] 。

示例 3:

输入:nums1 = [0], m = 0, nums2 = [1], n = 1

输出:[1]

解释:需要合并的数组是 [] 和 [1] 。合并结果是 [1] 。

注意,因为 m = 0 ,所以 nums1 中没有元素。nums1 中仅存的 0 仅仅是为了确保合并结果可以顺利存放到 nums1 中。

 解法一:拷贝数组,排序

思路:

将两个数组合并成一个数组,然后排序。

代码如下:

class Solution {
    public void merge(int[] nums1, int m, int[] nums2, int n) {
        //拷贝数组2到数组1中
        System.arraycopy(nums2, 0, nums1, m, n);
        //排序
        Arrays.sort(nums1);
    }
}

另一种写法:

class Solution {
    public void merge(int[] nums1, int m, int[] nums2, int n) {
        //遍历拷贝nums2中的元素到num1中
        int index = 0;
        for(int i=m; i < nums1.length; i++){
            nums1[i] = nums2[index++];
        }
        //对nums1进行排序
        Arrays.sort(nums1);
    }
}

解法二:双指针

思路:

创建一个临时数组,通过双指针分别指向两个数组对元素大小进行判断,按照升序的方式将元素加入临时数组,最后再拷贝给nums1即可。

代码如下:

class Solution {
    public void merge(int[] nums1, int m, int[] nums2, int n) {
        //创建一个临时数组
       int[] ret = new int[m+n];
       //依次分别代表nums1、nums2、ret的下标
        int index1 = 0, index2 = 0,index = 0;
        //双指针向后遍历,依次比较大小
        while(index1 < m && index2 < n){
            ret[index++] = nums1[index1] < nums2[index2] ? nums1[index1++] : nums2[index2++];
        }
        //如果nums2遍历完,但是nums1未遍历完,则将nums1剩余元素拷贝到ret中
        if(index1 < m){
            System.arraycopy(nums1, index1, ret, index1+index2, m+n-index1-index2);
        }
        //如果nums1遍历完,但是nums2未遍历完,则将nums2剩余元素拷贝到ret中
        if(index2 < n){
            System.arraycopy(nums2, index2, ret, index1+index2, m+n-index1-index2);
        }
        //将ret中的结果拷贝到nums1中
        System.arraycopy(ret, 0, nums1, 0, ret.length);
    }
}

解法三:逆向双指针

思路:

解法二固然解决了问题,但是里面依旧占用了空间。观察nums1,发现其后半部分仅仅是起到了占位符的作用,因此可以通过逆向双指针的方式可以不使用额外的空间即可完成合并。设置指针index1 和index2分别指向 nums1 和 nums2 的最后面,从后面的元素值开始比较遍历,同时设置指针index指向 nums1 的最末尾,每次遍历比较值大小之后,则进行填充。当index1<0 时遍历结束,此时 nums2 中数据未拷贝完全,将其直接拷贝到 nums1 的前面,最后得到结果数组.

代码如下:

class Solution {
    public void merge(int[] nums1, int m, int[] nums2, int n) {
                //从后向前遍历
        int index1 = m-1, index2 = n-1,index = m+n-1;
        //比较大小
        while(index1 >= 0 && index2 >= 0){
            nums1[index--] = nums1[index1] < nums2[index2] ? nums2[index2--] :nums1[index1--];
        }
        //拷贝剩余元素
        System.arraycopy(nums2, 0, nums1, 0, index2 +1);
    }
}

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

Leetcode 88:合并两个有序数组 的相关文章

  • java.lang.NoClassDefFoundError:org.apache.batik.dom.svg.SVGDOMImplementation

    我在链接到我的 Android LibGDX 项目的 Apache Batik 库时遇到了奇怪的问题 但让我们从头开始 在 IntelliJ Idea 中我有一个项目 其中包含三个模块 Main Android 和 Desktop 我强调的
  • Java new Date() 打印

    刚刚学习 Java 我知道这可能听起来很愚蠢 但我不得不问 System out print new Date 我知道参数中的任何内容都会转换为字符串 最终值是 new Date 返回对 Date 对象的引用 那么它是如何打印这个的呢 Mo
  • 如何使用 Java 和 Selenium WebDriver 在 C 目录中创建文件夹并需要将屏幕截图保存在该目录中?

    目前正在与硒网络驱动程序和代码Java 我有一种情况 我需要在 C 目录中创建一个文件夹 并在该文件夹中创建我通过 selenium Web 驱动程序代码拍摄的屏幕截图 它需要存储在带有时间戳的文件夹中 如果我每天按计划运行脚本 所有屏幕截
  • 在画布上绘图

    我正在编写一个 Android 应用程序 它可以在视图的 onDraw 事件上直接绘制到画布上 我正在绘制一些涉及单独绘制每个像素的东西 为此我使用类似的东西 for int x 0 x lt xMax x for int y 0 y lt
  • Play框架运行应用程序问题

    每当我尝试运行使用以下命令创建的新 Web 应用程序时 我都会收到以下错误Play http www playframework org Error occurred during initialization of VM Could no
  • 在 HTTPResponse Android 中跟踪重定向

    我需要遵循 HTTPost 给我的重定向 当我发出 HTTP post 并尝试读取响应时 我得到重定向页面 html 我怎样才能解决这个问题 代码 public void parseDoc final HttpParams params n
  • JAXb、Hibernate 和 beans

    目前我正在开发一个使用 Spring Web 服务 hibernate 和 JAXb 的项目 1 我已经使用IDE hibernate代码生成 生成了hibernate bean 2 另外 我已经使用maven编译器生成了jaxb bean
  • 无法展开 RemoteViews - 错误通知

    最近 我收到越来越多的用户收到 RemoteServiceException 错误的报告 我每次给出的堆栈跟踪如下 android app RemoteServiceException Bad notification posted fro
  • JavaMail 只获取新邮件

    我想知道是否有一种方法可以在javamail中只获取新消息 例如 在初始加载时 获取收件箱中的所有消息并存储它们 然后 每当应用程序再次加载时 仅获取新消息 而不是再次重新加载它们 javamail 可以做到这一点吗 它是如何工作的 一些背
  • Liferay ClassNotFoundException:DLFileEntryImpl

    在我的 6 1 0 Portal 实例上 带有使用 ServiceBuilder 和 DL Api 的 6 1 0 SDK Portlet 这一行 DynamicQuery query DynamicQueryFactoryUtil for
  • 操作错误不会显示在 JSP 上

    我尝试在 Action 类中添加操作错误并将其打印在 JSP 页面上 当发生异常时 它将进入 catch 块并在控制台中打印 插入异常时出错 请联系管理员 在 catch 块中 我添加了它addActionError 我尝试在jsp页面中打
  • 我可以使用 HSQLDB 进行 junit 测试克隆 mySQL 数据库吗

    我正在开发一个 spring webflow 项目 我想我可以使用 HSQLDB 而不是 mysql 进行 junit 测试吗 如何将我的 mysql 数据库克隆到 HSQLDB 如果您使用 spring 3 1 或更高版本 您可以使用 s
  • 从 127.0.0.1 到 2130706433,然后再返回

    使用标准 Java 库 从 IPV4 地址的点分字符串表示形式获取的最快方法是什么 127 0 0 1 到等效的整数表示 2130706433 相应地 反转所述操作的最快方法是什么 从整数开始2130706433到字符串表示形式 127 0
  • Java按日期升序对列表对象进行排序[重复]

    这个问题在这里已经有答案了 我想按一个参数对对象列表进行排序 其日期格式为 YYYY MM DD HH mm 按升序排列 我找不到正确的解决方案 在 python 中使用 lambda 很容易对其进行排序 但在 Java 中我遇到了问题 f
  • Java TestNG 与跨多个测试的数据驱动测试

    我正在电子商务平台中测试一系列商店 每个商店都有一系列属性 我正在考虑对其进行自动化测试 是否有可能有一个数据提供者在整个测试套件中提供数据 而不仅仅是 TestNG 中的测试 我尝试不使用 testNG xml 文件作为机制 因为这些属性
  • Java Integer CompareTo() - 为什么使用比较与减法?

    我发现java lang Integer实施compareTo方法如下 public int compareTo Integer anotherInteger int thisVal this value int anotherVal an
  • Java执行器服务线程池[关闭]

    很难说出这里问的是什么 这个问题是含糊的 模糊的 不完整的 过于宽泛的或修辞性的 无法以目前的形式得到合理的回答 如需帮助澄清此问题以便重新打开 访问帮助中心 help reopen questions 如果我使用 Executor 框架在
  • Java列表的线程安全

    我有一个列表 它将在线程安全上下文或非线程安全上下文中使用 究竟会是哪一个 无法提前确定 在这种特殊情况下 每当列表进入非线程安全上下文时 我都会使用它来包装它 Collections synchronizedList 但如果不进入非线程安
  • 如何从泛型类调用静态方法?

    我有一个包含静态创建方法的类 public class TestClass public static
  • 当我从 Netbeans 创建 Derby 数据库时,它存储在哪里?

    当我从 netbeans 创建 Derby 数据库时 它存储在哪里 如何将它与项目的其余部分合并到一个文件夹中 右键单击Databases gt JavaDB in the Service查看并选择Properties This will

随机推荐

  • 服务器运维常用命令

    一 linux 1 下载文件 wget O filename url 简单输出下载 wget nv O filename url 2 查看文件前几行 head n 20 file txt 3 查看目录下文件夹的大小 du d 1 h 4 c
  • 政务区块链电子证照应用场景

    政务区块链对于电子证照共享的应用场景 区块链电子证照系统场景 所解决的是证照共享的问题 在预防各部门自己的证照被批量的被盗用或被篡改 采用区块链证照模式 将各个部门的证照共享 解决的问题 证件被批量盗取 证件被他方恶意修改 证件共享难 实现
  • Linux power supply framwork & drvs

    转自 http www wowotech net pm subsystem psy class overview html 按照自己的习惯改了下排版 博主表打我 0 涉及文件 framwork drivers power power sup
  • macOS如何查看pkg安装包中的内部文件

    目录 写在前面 安装App 使用 pkg 信息面板 脚本查看 写在前面 macOS如何查看 pkg 安装包中的内部文件 我们在整系统的时候 有的时候需要查看 pkg 的内部文件 本文就教一教大家macOS如何查看 pkg 安装包中的内部文件
  • 设置锚点

    导航栏的定位 document scroll function if document scrollTop gt 442 nav css position fixed background ffffff top 0px z index 10
  • LinuxC文件操作接口

    LinuxC文件操作接口 创建与删除 创建文件 FILE fopen const char filename const char mode int open const char pathname int flags mode t mod
  • python入门之逻辑判断

    目录 一 判断 if 语句 二 逻辑运算 三 if语句进阶 四 综合应用 石头剪刀布 五 循环 一 判断 if 语句 1 判断语句演练 判断年龄 需求 1 定义一个整数变量记录年龄 2 判断是否满18岁 gt 3 如果满18岁 允许进网吧嗨
  • IDEA中测试代码覆盖率(Run with Coverage)插件出错的解决方式

    在进行实验时第一步要求安装测试代码覆盖率的插件时 发现idea上自带了可以直接使用的功能 我们在写好或者导入junit测试代码之后idea会自动帮我们下载junit 配置好相关设置之后就可以运行 正常的直接运行测试代码都可以直接进行但是这个
  • JQuery

    公式 a href 点我 a
  • 基于Node.js的NoSQL产品:FileDB V3.0开发完毕

    FileDB前两版是基于Java和Servlet容器的 且只能现实简单的Key Value数据存取 V3 0版使用了Javascript语言重写代码 并进行了重新设计 运行环境改为了Node js V3 0版功能有所增强 支持建任意多个表
  • SpringBoot在一定时间内限制接口请求次数-接口防刷拦截

    前一篇文字写了springboot的注册登录接口 并且这两个接口是开放的 特别是注册接口为了防止恶意注册 需要设置拦截 需要用到的知识 注解 AOP ExpiringMap 带有有效期的映射 需要自定义注解 把注解添加到我们的接口上 定义一
  • Qt插件机制及加载流程

    简介 插件实际上就是一个个动态库 动态库在不同平台下后缀名不一样 比如在 Windows下以 dll结尾 Linux 下以 so结尾 那么开发插件其实就是开发一个动态库 该动态库能够很好的加载进主程序 访问主程序资源 和主程序之间进行通信
  • k8s-核心实战

    一 资源创建方式 使用命令行 使用yum 二 NameSpace 名称空间 用来对集群资源进行隔离划分 默认只隔离资源 不隔离网络 例如创建开发 测试 生产等命令空间 可以保证一个应用引用配置只能读取自己名称空间内的资源 但是可以访问不同名
  • 悬镜安全宣布完成数千万元Pre-A轮融资

    榜样的力量 数据猿公益策划活动 寻找新冠战 疫 中国数据智能产业先锋力量 申报项目 提交文章 或深度采访 即可参与此次活动最终推出的榜单 勋章 思想者合集以及人物条漫等内容的评选 并有全网超过100家媒体同步扩散传播 丨点击 这里 了解详情
  • 基于微信小程序的医院挂号预约系统

    末尾获取源码 开发语言 Java Java开发工具 JDK1 8 后端框架 SSM 前端 Vue 数据库 MySQL5 7和Navicat管理工具结合 服务器 Tomcat8 5 开发软件 IDEA Eclipse 是否Maven项目 是
  • 双系统安装Win10+Ubuntu18.04超详细教程

    双系统安装Win10 Ubuntu18 04超详细教程 本教程主要内容包括 准备工作 制作U盘 磁盘分区和安装过程 文章目录 双系统安装Win10 Ubuntu18 04超详细教程 一 准备工作 1 1 确认BIOS模式 1 2 确认硬盘数
  • MySql 快速插入千万级大数据

    原文地址 http blog csdn net oldbai001 article details 51693139 在数据分析领域 数据库是我们的好帮手 不仅可以接受我们的查询时间 还可以在这基础上做进一步分析 所以 我们必然要在数据库插
  • CFile::Open的一些使用说明

    CFIIE类是MFC的文件类的基类 它直接提供无缓冲的二进制磁盘I O设备 并且通过它的派生类可以提供对text文件和内存文件的存取 CFILE与CArchive类一起提供对MFC序列化的支持 CFILE类和它的派生类之间的等级关系 允许你
  • 卡尔曼/扩展卡尔曼滤波器的原理及应用

    卡尔曼滤波器的原理及应用 应用前提 算法详细介绍 应用举例 下一步 原文地址 http blog csdn net lizilpl article details 45289541 1 应用前提 要应用kalman Filter 首先要有三
  • Leetcode 88:合并两个有序数组

    题目描述 给你两个按 非递减顺序 排列的整数数组 nums1 和 nums2 另有两个整数 m 和 n 分别表示 nums1 和 nums2 中的元素数目 请你 合并 nums2 到 nums1 中 使合并后的数组同样按 非递减顺序 排列