LeetCode - 0088 合并两个有序数组

题目地址:https://leetcode.cn/problems/merge-sorted-array/description/

引言:话接上回,由于上次面试官着急下班,面试不得不提前终止,这不,他又找我去面试了

面试官:你好,小伙子,我们又见面了,上次看你的基础还不错,所以这次再好好面下你,请看下面的题目

合并两个有序数组

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

for example

输入: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 中的元素。

我看了下题目,思考片刻,暂时没有啥头绪,先来个笨办法。

:这道题目可以这样,先定义一个新的数组,长度为 m + n m + n m+n,通过两个指针,逐个比较两个数组的每一个数,按照从小到大的顺序填入新数组,最后将新数组的数复制到 nums1 ,下面是我的代码

public void merge(int[] nums1, int m, int[] nums2, int n) {// 定义两个指针p1,p2,分别指向第一个数组和第二个数组的第一个元素int p1 = 0, p2 = 0; int[] sorted = new int[m + n]; // 存储合并后的数组int cur; // 当前遍历到的元素// 遍历两个数组,当满足p1 < m || p2 < n时,肯定有数组没有遍历完while (p1 < m || p2 < n) {if (p1 == m) { // 第一个数组已经遍历完,直接取第二个数组的元素cur = nums2[p2++];} else if (p2 == n) { // 第二个数组已经遍历完,直接取第一个数组的元素cur = nums1[p1++];} else if (nums1[p1] < nums2[p2]) { // 如果第一个数组的当前元素比第二个数组当前元素小,则将第一个数组当前元素加入到 sorted 中cur = nums1[p1++];} else { // 否则,将第二个数组当前元素加入到 sorted 中cur = nums2[p2++];}// 将当前遍历到的元素加入到 sorted 数组中sorted[p1 + p2 - 1] = cur; }// 将 sorted 数组中的元素复制到 nums1 数组中for (int i = 0; i < m + n; i++) {nums1[i] = sorted[i];}
}

面试官:嗯,看起来还可以,你可以解释下sorted[p1 + p2 - 1] = cur这句代码吗,我不是很懂。

:其实很简单,当我们将一个元素加入到sorted数组时,我们使用表达式p1 + p2 - 1来确定该元素在sorted数组中的索引位置。这是因为我们在每次迭代中只会更新p1或p2的值,因此p1 + p2的结果减去1就是当前元素在sorted数组中的索引。

面试官:O ,懂了,你这个算法的时间复杂度是 O ( m + n ) O(m+n) O(m+n) ,空间复杂度也是 O ( m + n ) O(m+n) O(m+n) ,你可以不去引入新的数组来解决这个问题么?可不可以就在nums1数组上进行操作呢?

:可以的,我们直接在nums1上进行操作。
首先,定义三个指针 p1、p2 和 p3,其中 p1 指向 nums1 中的最后一个元素 m − 1 m - 1 m1,p2 指向 nums2 中的最后一个元素 n − 1 n - 1 n1 ,p3 指向合并后数组的最后一个位置 m + n − 1 m + n - 1 m+n1。如下图所示

:使用 while 循环,只要 p1 和 p2 都没有遍历完,就进行比较

  • 若 nums1[p1] 大于 nums2[p2],将 nums1[p1] 放入nums1[p3]的位置,并将 p1 和 p3 向前移动一位。

  • 若 nums1[p1] 不大于 nums2[p2],将 nums2[p2] 放入nums1[p3]的位置,并将 p2 和 p3 向前移动一位。

  • 如果 nums2 中还有元素未加入到nums1数组中,再将它们放入nums1数组中。

public void merge(int[] nums1, int m, int[] nums2, int n) {int p1 = m - 1; // 指向 nums1 中最后一个元素的索引int p2 = n - 1; // 指向 nums2 中最后一个元素的索引int p3 = m + n - 1; // 指向合并后数组的最后一个位置的索引// 循环比较两个数组中的元素,将较大的元素放到nums1[p3]while (p1 >= 0 && p2 >= 0) {if (nums1[p1] > nums2[p2]) { // 如果 nums1 当前元素大于 nums2 当前元素nums1[p3--] = nums1[p1--]; // 将 nums1 当前元素放入nums1数组的末尾,p1,p3向前移动} else { // 否则,将 nums2 当前元素放入nums1数组的末尾,p2,p3向前移动nums1[p3--] = nums2[p2--];}}// 如果 nums2 中还有元素未加入到nums1数组中,再将剩余的元素放入nums1数组中while (p2 >= 0) {nums1[p3--] = nums2[p2--];}
}

:上面的算法就没有引入额外的数组,只是有少许额外的变量存储指针,空间复杂度降到了 O ( 1 ) O(1) O(1)

面试官:不错不错,对这个问题分析的很好,思路清晰,看来你的数组题目还掌握的不错,尤其是利用指针来解决问题。那就回去等等通知吧,下一轮面试的时候我们再约时间,下一轮的题目可比这一次难哟,回家好好准备下。

:好的,面试官。下次见!

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

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

前后端完全开源!功能丰富的在线教室项目:Agora Flat

Agora Flat&#xff1a;高效集成的在线教室解决方案&#xff0c;重塑互动学习新体验。- 精选真开源&#xff0c;释放新价值。 概览 Agora Flat是在GitHub平台上公开分享的一个全面开源项目&#xff0c;它精心设计为一个高性能的在线教室解决方案&#xff0c;旨在便捷地搭建支持…

C++ | Leetcode C++题解之第84题柱状图中最大的矩形

题目&#xff1a; 题解&#xff1a; class Solution { public:int largestRectangleArea(vector<int>& heights) {int n heights.size();vector<int> left(n), right(n, n);stack<int> mono_stack;for (int i 0; i < n; i) {while (!mono_stack.em…

RuvarOA协同办公平台 多处 SQL注入漏洞复现

0x01 产品简介 RuvarOA办公自动化系统是广州市璐华计算机科技有限公司采用组件技术和Web技术相结合,基于Windows平台,构建在大型关系数据库管理系统基础上的,以行政办公为核心,以集成融通业务办公为目标,将网络与无线通讯等信息技术完美结合在一起设计而成的新型办公自动…

用户登录后端:登录密码解密后用PasswordEncoder验证密码是否正确

前置知识: 前端登录加密看用户登录 PasswordEncoder加密看PasswordEncoder详解 项目中因为要判断用户登录密码是否正确&#xff0c;通过输入错误次数锁住用户 1.后端配置rsa私钥 #密码加密传输&#xff0c;前端公钥加密&#xff0c;后端私钥解密 rsa:private_key: xxxx2. 读…

Hive 特殊的数据类型 Array、Map、Struct

Array 数组类型&#xff0c;存储数据类型一致的列表数据。 我们可以使用 array 方法来创建一个数组&#xff0c;如下所示&#xff1a; select array(1,2,3,4,5);如果其中的数据类型不一致&#xff0c;那么它会转换成统一的数据类型&#xff08;前提是能够进行转换&#xff0…

Coze扣子开发指南:AI零代码编程创建插件

在Coze扣子中创建插件&#xff0c;有两种方式&#xff0c;一是用API&#xff0c;具体方式参照上一篇文章《Coze扣子开发指南&#xff1a;用免费API自己创建插件》&#xff0c;还有一种方式就是编程&#xff0c;不过有了AI的帮助&#xff0c;即使不会编程的人&#xff0c;也可以…

针对 % 号 | 引起的 不安全情况

把网站开放的课程都检索下来了 一、情况1 org.apache.tomcat.util.http.Parameters processParameters 信息: Character decoding failed. Parameter [Mac] with value [%%%] has been ignored. Note that the name and value quoted here may be corrupted due to the failed…

猜猜歇后语

页面 在输入框中填写你猜的答案&#xff0c;点击“显示答案”按钮&#xff0c;显示正确答案。 页面代码 function showAnswer(element){var elem$(element);elem.next().show();} //# // 初始化DataGrid对象 $(#dataGrid).dataGrid({searchForm: $(#searchForm),columnModel:…

音视频-H264编码封装- MP4格式转Annex B格式

目录 1&#xff1a;H264语法结构回顾 2&#xff1a;H264编码补充介绍 3&#xff1a;MP4模式转Annex B模式输出到文件示例 1&#xff1a;H264语法结构回顾 在之前文章里介绍过H264的语法结构。 传送门: 视音频-H264 编码NALU语法结构简介 2&#xff1a;H264编码补充介绍 H…

Web自动化-日志收集

目标 1. 理解日志的相关概念 2. 掌握日志的基本用法 3. 掌握日志的高级用法 一、日志相关概念 目标 1. 了解日志的概念 2. 理解日志的作用 3. 掌握常见的日志级别 1. 日志 概念&#xff1a;日志就是用于记录系统运行时的信息&#xff0c;对一个事件的记录&#xff1b…

Springboot+Vue项目-基于Java+MySQL的制造装备物联及生产管理ERP系统(附源码+演示视频+LW)

大家好&#xff01;我是程序猿老A&#xff0c;感谢您阅读本文&#xff0c;欢迎一键三连哦。 &#x1f49e;当前专栏&#xff1a;Java毕业设计 精彩专栏推荐&#x1f447;&#x1f3fb;&#x1f447;&#x1f3fb;&#x1f447;&#x1f3fb; &#x1f380; Python毕业设计 &…

Jenkins 备份恢复插件 ThinBackup

系统环境&#xff1a; Jenkins 版本&#xff1a;2.213 一、简介 在部署完 Jenkins 后首先要准备的就是数据备份问题&#xff0c;尤其是在生产环境下的 Jenkins&#xff0c;如果数据丢失很可能导致项目上线和开发时间受到影响&#xff0c;所以备份数据很重要。还好&#xff0c;…

【DevOps】Linux 安全:iptables 组成、命令及应用场景详解

导读&#xff1a;全面掌握 iptables&#xff1a;从基础到实践 在 Linux 系统中&#xff0c;iptables 是一个非常强大的工具&#xff0c;它不仅是系统管理员用来构建和管理网络防火墙的首选工具&#xff0c;而且也是一个功能丰富的网络流量处理系统。无论是进行包过滤、监控网络…

韩顺平0基础学Java——第9天

p169-201 数组&#xff08;第六章&#xff09; 数组扩容 此时原来的数组arr被销毁。 牛蛙&#xff1a; 最后再加一句 SYstem。out。println&#xff08;“是否添加&#xff1f;”&#xff09;&#xff1b; char key myscanner。netx&#xff08;&#xff09;。charAT&…

AI写作推荐-写文ai-AI在线写作生成器-3步完成写作任务

AI写作利器&#xff1a;推荐几款神助攻文案创作工具 随着技术的进步&#xff0c;人工智能&#xff08;AI&#xff09;已达到高级水平&#xff0c;在众多领域展现其强大能力。 在文本创作的领域&#xff0c;人工智能&#xff08;AI&#xff09;应用已显著地提升了写作效率和创意…

【Python-爬虫】

Python-爬虫 ■ 爬虫分类■ 1. 通用网络爬虫&#xff1a;&#xff08;搜索引擎使用&#xff0c;遵守robots协议&#xff09;■ robots协议&#xff08;君子协议&#xff09; ■ 2. 聚集网络爬虫&#xff1a;自己写的爬虫程序 ■ urllib.request&#xff08;要导入的模块&#x…

2024年4月12日饿了么春招实习试题【第三题】-题目+题解+在线评测,2024.4.12,饿了么机试【Kruskal 算法, 最小生成树】

2024年4月12日饿了么春招实习试题【第三题】-题目题解在线评测&#xff0c;2024.4.12&#xff0c;饿了么机试 &#x1f3e9;题目一描述&#xff1a;样例1样例2解题思路一&#xff1a;[Kruskal 算法](https://baike.baidu.com/item/%E5%85%8B%E9%B2%81%E6%96%AF%E5%8D%A1%E5%B0%…

图像融合-下游任务(目标检测、实例分割、深度估计、局部区域细节放大)

下游任务: 采用目标检测、实例分割和深度估计的下游任务来验证图像融合结果质量。 文章目录 下游任务:1.目标检测2.实例分割3.深度估计局部细节放大工具Update1.目标检测 YOLOv8:https://github.com/ultralytics/ultralytics 步骤内容第一步下载项目到本地第二步安装READ…

前端笔记-day05

文章目录 01-结构伪类选择器02-结构伪类选择器-公式用法03-伪元素选择器04-盒子模型-组成05-盒子模型-边框线06-盒子模型-单方向边框线07-盒子模型-内边距08-盒子模型-padding多值写法09-盒子模型-尺寸计算10-盒子模型-版心居中11-清除默认样式12-元素溢出overflow13-外边距合并…

【半夜学习MySQL】数据库中的数据类型(含数值类型、文本二进制类型、时间类型、String类型详谈)

&#x1f3e0;关于专栏&#xff1a;半夜学习MySQL专栏用于记录MySQL数据相关内容。 &#x1f3af;每天努力一点点&#xff0c;技术变化看得见 文章目录 数据类型分类数值类型bit类型tinyint类型int类型float类型decimal类型 文本、二进制类型char类型varchar类型 时间类型Strin…