合并两个有序数组(leetcode_刷题1)

目录

题目:合并两个有序数组

题目分析方向1:

题目分析方向2:


题目:合并两个有序数组

题目要求:

给你两个按 非递减顺序 排列的整数数组 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 中。

提示:

  • nums1.length == m + n
  • nums2.length == n
  • 0 <= m, n <= 200
  • 1 <= m + n <= 200
  • -109 <= nums1[i], nums2[j] <= 109

进阶:你可以设计实现一个时间复杂度为 O(m + n) 的算法解决此问题吗?

题目分析:

题目分析方向1:

首先我们看到这个是个有序数组,因此可以考虑使用归并的思想,合并两个有序数组。 

那我们可把上面的nums1和nums2的数据尾插到新的数组来nums3

规律1:依次比较,取小的尾插到新数组nums3里面,也就是把最小的数据取出来放到新的数组nums3里面。 

规律2:数据大小相同,则随便取nums1或者nums2数组中的一个数据即可。

因为是非递减数列:那么该数组的数组从前到后,要么就是比前面大,要么跟前面相等。

大小数据是n

那么这个归并的时间复杂度是经典的O(n);

那么尾插到nums3数组后的数据结果为为nums3={1,2,2,3,5,6};

如果是这种有序数据,我们是不是有些人会想,如果使用冒泡排序也是可以实现啊。

那如果我们假设两个数组的长度是N,

那么使用冒泡排序的时间复杂度就是O(N2),

那么使用qsort 快速排序也是O(N*log2N)(log2N,就是以2为低的对数)。

从以上的分析,使用归并的思想也是可以将上面两个有序数组进行排序,但是很显然这个是不符合题目要求的:因为题目的要是是合并后的数据存放到nums1中。 

但是在有序无序的数据,如nums1={2,2,3,0,0,0};nums2={1,5,6};如果nums2[0]<nums1[0],那么nums2[0]的值就覆盖到nums1[0]里面,这个就会导致原本数组数据不对了。

因此,这里我们得另想他法:

题目分析方向2:

既然分析方向1的解法只适合有序的的数组,那么归并的方法就显得不合适了。

这里,我想到了一个方法就是从后往前比较。 

画图吧!

从图中,我们可以知道两个有序数组进行第四次比较的时候就完成了两个数组的合并。 

当完成第四次比较之后,我们知道nums2是位于首元素位置,而nums1则位于元素1位置。

那么我们可能会问,nums1并没有比较遍历全部元素,是否还需要剩下的元素进行排序

结果显然是不需要的。因为,nums1中剩下的元素位于数组的低地址处,本身属于有序数组,因为不需要再进行比较。 

那么代码上是怎么实现的呢?

在这里解释一下部分代码:

nums1[i--],会先返回nums[i]的值,也就是此刻参与计算的还是nums[1]的值,同时i--,让i指向下一个元素。

并且从运算的逻辑来看,i--属于先赋值后运算的符号。

 

void merge(int* nums1, int nums1Size, int m, int* nums2, int nums2Size, int n) {
   int i=m-1;
   int j=n-1;
   int 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--];
   }

}

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

在python中安装库,会有conda安装,也会有pip安装,conda与pip的区别是什么?

文章目录 一、Conda是什么&#xff1f;二、pip是什么&#xff1f;三、pip与conda的区别&#xff1a;总结 一、Conda是什么&#xff1f; Conda是一个开源的包管理系统&#xff0c;它是Anaconda公司为Python和其他编程语言开发的。它主要用于数据科学和机器学习领域&#xff0c;…

SpringIOC之@Configuration

博主介绍&#xff1a;✌全网粉丝5W&#xff0c;全栈开发工程师&#xff0c;从事多年软件开发&#xff0c;在大厂呆过。持有软件中级、六级等证书。可提供微服务项目搭建与毕业项目实战&#xff0c;博主也曾写过优秀论文&#xff0c;查重率极低&#xff0c;在这方面有丰富的经验…

字符串指令集

字符串指令的格式 例子1就成功发送了指令 例子2就是发送的字符串有误 查询当前位置就会在附加信息中返回当前座位的坐标 第一个指令的参数就是闪灯的两个参数 如第一个示例就是10ms On Time 第二个就是Off Time 使用标准库来接收字符串命令 字符串指令的接收 因为一个指令就是…

麒麟系统进入救援模式或者是crtl D界面排查方法

如出现以下图片的情况可能需要修复磁盘&#xff1a; V10GFB-desktop&#xff1a; 开机后发现一致卡在此界面&#xff1a; 按esc键后有以下报错信息说明在/etc/fstab里面编写的外挂磁盘的命令有问题 解决方法如下&#xff1a;进入单用户模式对/etc/fstab进行修改&#xff1a; …

proftpd安全加固:限制用户FTP登录

其实无所谓安全加固&#xff0c;因为proftp默认就是限制用户FTP登录的&#xff0c;这里有点凌乱得研究和实验了proftpd如何进行限制的&#xff0c;以及可能的放开限制。懂了这些才能更好的进行防护配置。 RootLogin指令其实主要作用就是启用ROOT访问。通常&#xff0c;proftpd在…

智能优化算法应用:基于广义正态分布算法无线传感器网络(WSN)覆盖优化 - 附代码

智能优化算法应用&#xff1a;基于广义正态分布算法无线传感器网络(WSN)覆盖优化 - 附代码 文章目录 智能优化算法应用&#xff1a;基于广义正态分布算法无线传感器网络(WSN)覆盖优化 - 附代码1.无线传感网络节点模型2.覆盖数学模型及分析3.广义正态分布算法4.实验参数设定5.算…

【教学类-35-06】17号的学号字帖延伸出的全体字帖(1-9去0)(A4竖版1份)

作品展示 背景需求&#xff1a; 给大4班17号同学单独做了一个学号字帖后&#xff0c;我想可以把这样的学具用在中班&#xff08;我马上要成为中4班老师了&#xff09;&#xff0c;那就需要给全班做一份这样的大号学号贴。 使用17号同学的word模板&#xff08;见下文&#xff…

搭配君正主控芯片测评:创想三维物有所值,让你玩3D打印,而不是玩3D打印机

如果你在一年前开始接触3D打印&#xff0c;并且拥有一台入门级的3D打印机。那么&#xff0c;我相信很大一部分时间你是在给机器打“补丁”&#xff0c;让它真正能为你所用。而这台机器很可能是来自创想三维&#xff0c;不出意外就是其Ender系列的某一款。 然而&#xff0c;现在…

【夯实技术基本功】「底层技术原理体系」全方位带你认识和透彻领悟正则表达式(Regular Expression)的开发手册(正则表达式定义 )

【夯实技术基本功】「底层技术原理体系」全方位带你认识和透彻领悟正则表达式的开发手册 前提介绍正则表达式正则表达式的历史正则表达式的定义正则表达式的组成普通字符非打印字符特殊字符限定符限定符案例分析贪婪匹配/非贪婪匹配方式 定位符选择组合符后向引用 总结心得 前提…

2024年安防视频监控行业将面临4大机遇和挑战

当前安防监控市场处于快速发展的阶段&#xff0c;市场不仅有传统的视频监控、门禁系统等单一功能的设备&#xff0c;还涌现出了一系列集成多种安防功能的综合系统。随着人工智能技术的发展&#xff0c;安防监控设备不仅可以对场所进行实时监控&#xff0c;还可以通过图像识别、…

【STM32】蓝牙氛围灯

Docs 一、项目搭建和开发流程 一、项目需求和产品定义 1.需求梳理和产品定义 一般由甲方公司提出&#xff0c;或由本公司市场部提出 需求的重点是&#xff1a;这个产品究竟应该做成什么样&#xff1f;有哪些功能&#xff1f;具体要求和参数怎样&#xff1f;此外还要考虑售价…

vue中组件传值方法

父组件给子组件传值 一、 1.在子组件标签中写入父组件传递数据 向下传递prop 2.在子组件内声明props选项接收父组件传递的数据 props:[,,] 父组件&#xff1a; <Header :msgmsg ></Header> 子组件&#xff1a; props:[msg], 二、 provide i…

一个简单得爬虫小案例:获取西瓜网视频数据【python】

嗨喽~大家好呀&#xff0c;这里是魔王呐 ❤ ~! python更多源码/资料/解答/教程等 点击此处跳转文末名片免费获取 第三方模块: requests >>> pip install requests 环境介绍: python 3.8 解释器 pycharm 编辑器 思路分析 找到数据来源 你要爬取的视频 筛选 找不…

第二十一章网络通信

网络程序设计基础 局域网与互联网 为了实现两台计算机的通信&#xff0c;必须用一个网络线路连接两台计算机。如下图所示 网络协议 1.IP协议 IP是Internet Protocol的简称&#xff0c;是一种网络协议。Internet 网络采用的协议是TCP/IP协议&#xff0c;其全称是Transmissio…

当你还在纠结用什么技术时,这位独立开发者用PHP和JavaScript实现财务自由了

大家好&#xff0c;我是风筝&#xff0c;微信搜「古时的风筝」&#xff0c;更多干货 一个个人产品卖了5400万&#xff0c;这大概就是最成功的独立开发者了吧 这位独立开发者是 levelsio&#xff0c;他的真名是 Pieter Levels&#xff0c;是一位荷兰的独立开发者。看看人家的工…

C++异常剖析

什么是异常&#xff1f; 在程序运行的过程中&#xff0c;我们不可能保证我们的程序百分百不出现异常和错误&#xff0c;那么出现异常时该怎么报错&#xff0c;让我们知道是哪个地方错误了呢? C中就提供了异常处理的机制。 一、异常处理的关键字 &#xff08;1&#…

C 语言 变量

变量初始值 全局变量&#xff1a;初始值是 0 局部变量&#xff1a;初始值是 随机的 类型限定符 通常不需要显式使用 register 关键字来优化变量的存储和访问。 关键字 _Complex和_Imaginary分别用于表示复数和虚数&#xff08;二者皆是数学概念&#xff09; 变量的声明和定义 c…

逻辑漏洞与越权

逻辑漏洞与越权 越权 如果使用A用户的权限去操作B用户的数据&#xff0c;A的权限小于B的权限&#xff0c;如果能够成功操作&#xff0c;则称之为越权操作。 越权漏洞形成的原因是后台使用了 不合理的权限校验规则导致的。 一般越权漏洞容易出现在权限页面&#xff08;需要登…

因为 postman环境变量全局变量设置好兄弟被公司优化了!

postman环境变量、全局变量设置 在公司中&#xff0c;一般会存在开发环境、测试环境、线上环境等&#xff0c;如果需要在不 同的环境下切换做接口测试&#xff0c;显然我们需要把所有接口的域名进行修改&#xff0c;如果接 口测试用例较多&#xff0c;那么修改会非常费力&…

selenium安装使用详解

安装selenium不少人使用pip命令来安装selenium&#xff0c;辛辛苦苦安装完之后&#xff0c;还是不能使用。所以我们可以是直接使用编译器&#xff0c;pycharm直接安装selenium扩展包。 同时&#xff0c;在这我为大家准备了一份软件测试视频教程&#xff08;含面试、接口、自动…