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.xdnf.cn/news/1420350.html

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

相关文章

【二叉树】Leetcode 二叉树的锯齿形层序遍历

题目讲解 103. 二叉树的锯齿形层序遍历 算法讲解 这道题其实是和N叉树层序遍历是一样的&#xff0c;只不过是要求每一次的遍历的方向不一样&#xff1b;注意&#xff1a;这一次的使用的队列不能够是queue了&#xff0c;因为需要从后往前遍历容器&#xff0c;所以就可以使用v…

vs code中如何使用git

由于本地代码有了一些储备&#xff0c;所以想通过网址托管形式&#xff0c;之前一直使用了github&#xff0c;但是鉴于一直被墙&#xff0c;无法登录账号&#xff0c;所以选择了国内的gitee来作为托管网站。 gitee的网址&#xff1a;Gitee - 基于 Git 的代码托管和研发协作平台…

事件高级部分

一&#xff0c;注册事件 即给元素添加事件 1.传统注册方式 2.方法监听注册方式 事件类型&#xff1a;字符串形式&#xff0c;不用带on 可以给一个元素添加多个程序 二.删除事件 1.方式 参数见上文 三.DOM事件流 事件的传播过程叫做事件流 js代码只能获取一个阶段&#xf…

JAVA毕业设计138—基于Java+Springboot+Vue的医院预约挂号小程序(源代码+数据库)

毕设所有选题&#xff1a; https://blog.csdn.net/2303_76227485/article/details/131104075 基于JavaSpringbootVue的医院预约挂号小程序(源代码数据库)138 一、系统介绍 本系统前后端分离带小程序和后台 小程序&#xff08;用户端&#xff09;&#xff0c;后台管理系统&a…

判断上三角矩阵 分数 15

题目展示&#xff1a; 代码展示&#xff1a; 点这里&#xff0c;输入题目名称即可检索更多题目答案 ​#include<stdio.h>int main() {//T-tint t 0;scanf("%d",&t);while(t--)//循环t次&#xff0c;处理t个矩阵{int n 0;scanf("%d",&n);…

【机器学习】集成学习在信用评分领域实例

集成学习在信用评分领域的应用与实践 一、引言二、集成学习的概念与原理三、集成学习在信用评分中的应用实例四、总结与展望 一、引言 在当今金融数字化快速发展的时代&#xff0c;信用评分成为银行、金融机构等评估个人或企业信用风险的重要工具。然而&#xff0c;单一的信用评…

QuickBooks 2024 for Mac 激活版:智慧管理,财务无忧

想要轻松掌控财务&#xff0c;实现高效管理吗&#xff1f;QuickBooks 2024 for Mac&#xff0c;您的智慧财务管理专家&#xff0c;为您带来前所未有的便利和体验。无论是账务、工资还是销售和库存&#xff0c;它都能一手搞定。直观易用的界面&#xff0c;让您轻松上手&#xff…

5.10.4 Vision Transformer的条件位置编码(CPE)

用于视觉 Transformer 的条件位置编码&#xff08;CPE&#xff09;方案与之前预定义且独立于输入标记的固定或可学习位置编码不同&#xff0c;CPE 是动态生成的&#xff0c;并以输入标记的局部邻域为条件。 CPE 可以轻松泛化到比模型在训练期间见过的输入序列更长的输入序列。…

YOLOv8+CLIP实现图文特征匹配

本文通过结合YOLOv8s的高效物体检测能力与CLIP的先进图像-文本匹配技术&#xff0c;展示了深度学习在处理和分析复杂多模态数据中的潜力。这种技术的应用不仅限于学术研究&#xff0c;还能广泛应用于工业、商业和日常技术产品中&#xff0c;以实现更智能的人机交互和信息处理。…

【全开源】排队叫号系统基于FastAdmin+GatewayWorker(源码搭建/上线/运营/售后/维护更新)

一款基于FastAdminGatewayWorker开发的多项目多场景排队叫号系统&#xff0c;支持大屏幕投屏&#xff0c;语音播报叫号&#xff0c;可用于餐厅排队取餐、美甲店排队取号、排队领取、排队就诊、排队办理业务等诸多场景&#xff0c;助你轻松应对各种排队取号叫号场景。 功能简介…

Qt Tab键切换焦点顺序:setTabOrder()

使用这个方法setTabOrder()&#xff0c;设置使得焦点的顺序从前到后依次是&#xff1a; ui->lineEdit》 ui->lineEdit_2》ui->lineEdit_3 》ui->lineEdit_4 焦点先在ui->lineEdit上&#xff0c;当按下Tab键时&#xff0c;焦点跑到ui->lineEdit_2上。。。按…

mysql设置远程访问权限,允许其他IP访问

文章目录 更改mysql配置文件登录mysql 更改mysql配置文件 查找.ini或者.cnf文件 更改bind-address为0.0.0.0 [mysqld] character-set-serverutf8mb4 bind-address0.0.0.0 default-storage-engineINNODB [mysql] default-character-setutf8mb4 [client] default-character-s…

网络安全等级保护的发展历程

1994年国务院147号令第一次提出&#xff0c;计算机信息系统实行安全等级保护&#xff0c;这也预示着等保的起步。 2007年《信息安全等级保护管理办法》的发布之后。是等保在各行业深耕落地的时代。 2.0是等保版本的俗称&#xff0c;不是等级。等保共分为五级&#xff0c;二级…

WEB前端复习——CSS

CSS:层叠样式表 将显示样式与内容分开 基本语法&#xff1a; 选择器{ 规则; } ①标签选择器&#xff1a;以HTML标签名为选择 <style>p{color: red;} </style> <body><p>你好</p> </body> ②id选择器&#xff1a;一次性的 以#号定义 &l…

Java设计模式 _行为型模式_解释器模式

一、解释器模式 1、解释器模式 解释器模式&#xff08;Interpreter Pattern&#xff09;是一种行为型模式。它提供了评估语言的语法或表达式的方式。通过实现了一个表达式接口&#xff0c;通常该接口解释一个特定且重复出现的问题。 2、实现思路 &#xff08;1&#xff09;、…

[机器学习-05] Scikit-Learn机器学习工具包进阶指南:协方差估计和交叉分解功能实战【2024最新】

&#x1f3a9; 欢迎来到技术探索的奇幻世界&#x1f468;‍&#x1f4bb; &#x1f4dc; 个人主页&#xff1a;一伦明悦-CSDN博客 ✍&#x1f3fb; 作者简介&#xff1a; C软件开发、Python机器学习爱好者 &#x1f5e3;️ 互动与支持&#xff1a;&#x1f4ac;评论 &…

探索社交障碍的根源:原因分析与应对策略

社交障碍是许多人在社交场合中面临的一大挑战。它可能源于多种多样的原因&#xff0c;包括情绪感受能力、语感、文字表达能力以及环境等。在这篇博客中&#xff0c;我们将分析这些导致社交障碍的原因&#xff0c;并提出相应的应对策略。 首先&#xff0c;情绪感受能力是社交中不…

后端项目开发笔记

Maven打包与JDK版本不对应解决方法 我这里使用jdk8。 <build><plugins><plugin><groupId>org.apache.maven.plugins</groupId><artifactId>maven-compiler-plugin</artifactId><version>3.8.1</version><configurat…

时序分解 | Matlab实现LMD局域均值分解

时序分解 | Matlab实现LMD局域均值分解 目录 时序分解 | Matlab实现LMD局域均值分解效果一览基本介绍程序设计参考资料 效果一览 基本介绍 时序分解 | Matlab实现LMD局域均值分解 Matlab语言 1.算法新颖小众&#xff0c;用的人很少&#xff0c;包含分解图 2.直接替换数据即可用…

win11安装各银行的网银助手都无法打开,双击没反应?

大神贴 右键网银助手属性&#xff0c;在目标后面敲一下空格&#xff0c;输入**-runapp**&#xff0c;应用即可。 如图示例&#xff1a;