融合有序,创造无限——解密力扣“合并两个有序数组”

news2025/1/16 11:33:32

在这里插入图片描述

本篇博客会讲解力扣“88. 合并两个有序数组”这道题,这是题目链接。

其实,有经验的朋友一看到这个题目的名字,应该就明白了,这玩意和归并排序脱不了干系。下面我们来审题:
在这里插入图片描述
输出示例如下:
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
以下是一些提示和进阶要求:
在这里插入图片描述
这道题的思路是经典的归并排序的思路,即每次取小的放到新数组中,那么新数组也是有序的。不过这么做有一个问题:需要开辟一个新的数组,空间消耗较大。所以稍微改进一下:每次取小的放到数组1中。但这样又有新的问题:会导致有效数据被覆盖,比如数组1的第一个数比数组2的第一个数大,一开始就会把数组1的第一个数给覆盖了。

既然以上思路不行,那就再改进一下:不是从前往后遍历,而是从后往前。换句话说,从后往前分别遍历2个数组,每次取大的数,放到数组1的后面就行了。这样无论如何都不会导致有效数据被覆盖。

下面动手写代码:

void merge(int* nums1, int nums1Size, int m, int* nums2, int nums2Size, int n){
    int end1 = m - 1; // 从后往前遍历数组1的有效数据
    int end2 = n - 1; // 从后往前遍历数组2的有效数据
    int end = m + n - 1; // 从后往前,寻找有效的目标位置
    while (end1 >= 0 && end2 >= 0)
    {
        // 把大的数放到后面
        if (nums1[end1] > nums2[end2])
        {
            nums1[end--] = nums1[end1--];
        }
        else
        {
            nums1[end--] = nums2[end2--];
        }
    }
}

当其中一个数组的有效数据全部遍历结束,此时有2种情况:

  1. 数组1遍历结束,此时有些有效数据还在数组2中,需要把这些数据拷贝到数组1中。
  2. 数组2遍历结束,此时数组1没有遍历完的有效数据本身就在数组1中,无需处理。
void merge(int* nums1, int nums1Size, int m, int* nums2, int nums2Size, int n){
    int end1 = m - 1; // 从后往前遍历数组1的有效数据
    int end2 = n - 1; // 从后往前遍历数组2的有效数据
    int end = m + n - 1; // 从后往前,寻找有效的目标位置
    while (end1 >= 0 && end2 >= 0)
    {
        // 把大的数放到后面
        if (nums1[end1] > nums2[end2])
        {
            nums1[end--] = nums1[end1--];
        }
        else
        {
            nums1[end--] = nums2[end2--];
        }
    }

    // 判断数组2是否还有数据没有拷贝到数组1中
    while (end2 >= 0)
    {
        nums1[end--] = nums2[end2--];
    }
}

在这里插入图片描述
这就通过了,非常完美。

总结

  1. 归并排序的思路:取小的放前面,或者取大的放后面。
  2. 如果从前往后会覆盖,那就从后往前。

感谢大家的阅读!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/501211.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

3.是人就能学会的Spring源码教学-IOC容器的核心实现原理

是人就能学会的Spring源码教学-IOC容器的核心实现原理 我们学习Spring源码的动力,估计大部分人都是因为面试中会问到吧。 那么我们今天就以面试问Spring来开头。 关于Spring,在面试的时候一般会问到的两个最基础的问题。 第一个什么是IOC&#xff1f…

技术控,看这里,一款支持断点调试的数据科学工具

数据科学是一门利用统计学、机器学习、数据挖掘、数据可视化等技术和方法,从数据中提取知识和信息的交叉学科。自上世纪60年代,统计学家John W.Tukey首次提出“数据分析”(Data Analysis)的概念起,数据科学已历经了几十…

ASEMI代理ADUM131E1BRWZ-RL原装ADI车规级ADUM131E1BRWZ-RL

编辑:ll ASEMI代理ADUM131E1BRWZ-RL原装ADI车规级ADUM131E1BRWZ-RL 型号:ADUM131E1BRWZ-RL 品牌:ADI /亚德诺 封装:SOIC-16-300mil 批号:2023 安装类型:表面贴装型 引脚数量:16 工作温度…

基于springboot的“智慧食堂”设计与实现(源码等)

摘要 随着Internet的发展,人们的日常生活已经离不开网络。未来人们的生活与工作将变得越来越数字化,网络化和电子化。网上管理,它将是直接管理“智慧食堂”系统的最新形式。本xx是以构建“智慧食堂”系统为目标,使用java技术制作…

智能仿写软件-智能伪原创改写软件

智能仿写工具:营销创意的必备利器 在当今快节奏和不断发展的商业环境中,企业营销人员需要在短时间内产生大量有创意和高质量的内容。因此,智能仿写工具作为营销策略的一种创新方法而出现,可以帮助企业的写作团队更快速地生成文章…

【软考数据库】第八章 数据库SQL语言

目录 8.1 SQL语言概述 8.2 数据库定义 8.2.1 创建表(create table) 8.2.2 修改表 (alter table) 8.2.3 删除表 (drop table) 8.2.4 索引 8.2.5 视图 8.3 数据操作 8.3.1 查询语句格式 8.3.2 分组查询 8.3.3 其他操作 8.3.4 约束 8.4 数据授权 8.4.1 授权grant 8…

数据库索引的原理,为什么要用 B+树,为什么不用二 叉树?

1、B树和B树 一般来说,数据库的存储引擎都是采用B树或者B树来实现索引的存储。首先来看B树,如图所士 B树是一种多路平衡树,用这种存储结构来存储大量数据,它的整个高度会相比二叉树来说,会矮很多。 而对于数据库而言…

RFID系统在物流仓储中的应用

RFID系统是一种无线识别技术,最近成为物流仓储行业的热门话题。本文将介绍RFID系统在物流仓储中的应用,包括如何使用RFID标签进行物流管理,如何使用RFID技术提高仓库的安全性,并细述RFID技术在物流仓储中的优势。除此之外&#xf…

ArrayList快速失败机制

文章目录 一、什么是快速失败机制二、例子三、底层原理四、解决方法五、快速失败机制的一个小bug 一、什么是快速失败机制 ArrayList实现了一种称为快速失败(fail-fast)的机制,该机制在并发修改时会抛出ConcurrentModificationException异常。 这种机制的实现原理是:ArrayList…

机器学习案例 | 通过EBG学习概念cup

基于解释的学习(explanation-basedlearning)可简称为解释学习,是20世纪80年代中期开始兴起的一种机器学习方法。解释学习根据任务所在领域知识和正在学习的概念知识,对当前实例进行分析和求解,得出一个表征求解过程的因果解释树,以…

spark2

18Spark中stage的划分 和 shuffle的概念 Stage的划分是根据宽依赖,当触发action算子时,按照从后往前的回溯算法,当遇到会发生shuffle算子的时候,就会切分stage。 Stage的划分本质是shuffle,即当遇到会发生shuffle算子的时…

E. Sergey and Subway(思维 + dp)

Problem - E - Codeforces Sergey Semyonovich 是 N 市县的市长,他一直在思考如何进一步改善 Nkers 的生活。不幸的是,几乎所有可以做的事情都已经完成了,白天他已经没有更多的想法(他现在喜欢在晚上睡觉)。然而&#…

MySQL 中的 distinct 和 group by 的区别

目录 distinct用法distinct多列去重 group by的使用单列去重多列去重 distinct和group by原理隐式排序基于上述原因,Mysql在8.0时,对此进行了优化更新: 结论推荐group by的原因 在语义相同,有索引的情况下:group by和d…

体验 Whisper

体验 Whisper 1. 什么是 Whisper2. Github 地址3. 创建虚拟环境4. 安装 ffmpeg5. 部署 Whisper6. 使用 Whisper 1. 什么是 Whisper Whisper 是一个通用的语音识别模型。它是在一个大型的不同音频数据集上训练出来的,也是一个多任务模型,可以进行多语言语…

MySQL笔记(一):设计范式、基础概念、数据库定义语言DDL

MySQL设计范式、基础概念、数据库定义语言DDL MySQL设计范式、基础概念、数据库定义语言DDL MySQL设计范式、基础概念、数据库定义语言DDL数据模型属性的特点 数据库的创建主键 数据库设计规范第一范式(1NF)第二范式(2NF)第三范式…

智能制造之路-从MES到MOM

当前,中国正在大力推动制造业的转型升级,实现由传统制造向智能制造转型。而制造信息化系统,作为支撑企业实现智能制造的一个关键因素,也正越来越多的吸引企业领导人的关注。 某大型制造业集团企业(下文简称M集团&…

【Java虚拟机】JVM日志分析和可视化工具实操

1.JVM垃圾GC日志参数配置实战 Java虚拟机中垃圾收集器在运行过程中输出的日志信息主要用于分析垃圾收集器的运行状态、优化垃圾收集器的工作效率以及定位垃圾收集相关的问题GC日志会包含以下内容 垃圾收集器的名称和版本信息。垃圾收集器的运行时间、开始时间和结束时间。垃圾…

【Fluent】利用TUI命令在保存或导出文件时,给文件名加上时间步长、流动时间、迭代步数等求解过程变量的自动编码

一、问题背景 在CSDN的一篇博客(从Fluent导出数据到txt文档)中,一位博主分享了一串导出求解数据的TUI命令。 file/export/ascii data%t.txt () yes h2s y-velocity x-velocity q no 当时我不知道里面的%t是啥意思,估计是跟时间…

JMeter介绍与安装教程

简介 JMeter是一款开源的负载测试工具,它可以用于测试Web应用程序、API、数据库、负载均衡器等。JMeter 是由 Apache 软件基金会开发的,其目标是提供一个高性能、易于使用的负载测试工具。 JMeter 具有以下特点: 可扩展性:JMet…

又开发好一个系统,详细记录软著申请过程

经过几个通宵达旦的撸代码之后,又开发好了一个系统,和以往一样,系统开发好了少不了申请软件著作权证书,兄弟们,软著申请搞起来啊。 在版权保护中心后台提交资料,没有账号的需要先注册一个账号。很重要的一步…