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.mzph.cn/news/835869.shtml

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

相关文章

Redis——Java三种客户端(Jedis、Lettuce和Redisson)

Redis在Java领域有着广泛的应用&#xff0c;为了更方便地与Redis进行交互&#xff0c;开发者们创建了多种Java客户端。其中&#xff0c;Jedis、Lettuce和Redisson是三种最为流行的Redis Java客户端。以下是关于这三种客户端的简要介绍&#xff1a; Jedis&#xff1a; Jedis是…

C++入门——命名空间、缺省参数、函数重载、引用、内敛函数、auto关键字

目录 前言 一、什么是C 1.1 C关键字(C98) 二、命名空间 2.1 命名空间定义 1.正常命名空间的定义 2.命名空间的定义可以嵌套 3.同名的命名空间会合并 2.2 命名空间的使用 三、C输入&输出 四、缺省参数 4.1 缺省参数概念 4.2 缺省参数分类 五、函数重载 5.1 …

C++数据抽象:构建安全且灵活的软件组件

目录标题 1. 数据抽象简介2. 抽象类与纯虚函数3. 实现数据抽象的步骤4. 示例&#xff1a;抽象基类与具体派生类5. 结论 在C编程语言中&#xff0c;数据抽象是一种核心的编程概念&#xff0c;它允许我们创建简单且易于管理的代码结构。通过数据抽象&#xff0c;我们可以隐藏复杂…

Vue11 Vue3完结撒花

shallowRef和shallowReactive shallowRef 作用&#xff1a;创建一个响应式数据&#xff0c;但只对顶层属性进行响应式处理 用法 let myVar shallowRef(initialValue)特点&#xff1a;只跟踪引用值变化&#xff0c;不关心值内部的属性变化 案例 <template><div c…

Springboot集成Netflix-ribbon、Enreka实现负载均衡-12

Netflix Ribbon简介 Netflix Ribbon是Netflix发布的云中间层服务开源项目&#xff0c;主要功能是提供客户端的软件负载均衡算法&#xff0c;将Netflix的中间层服务连接在一起。 具体来说&#xff0c;Ribbon是一个客户端负载均衡器&#xff0c;可以在配置文件中列出所有的服务…

ORACLE数据库一主多备DG环境(一对多)主备切换

本文主要分享一对多(一主多备)的DG环境主备切换的案例,我们的一套生产环境,一主四备,其中3个备库承载着查询业务,还有一个DG没有任务业务,由于主库的存储性能不给力,公司采购了新的存储,这个DG就是为了切换到新存储而搭建的,数据量1.5TB。 本文是在测试环境操作,之前…

【信息系统项目管理师】复习~第十五章

15.项目风险管理 每个项目都存在两个层面上的风险&#xff1a;①每个项目都有会影响项目达成目标的单个风险&#xff1b;②由单个风险和不确定性的其他来源联合导致的整体项目风险。项目风险会对项目目标产生负面或正面的影响&#xff0c;也就是风险与机会。项目风险管理旨在利…

PostgreSQL的学习心得和知识总结(一百四十三)|深入理解PostgreSQL数据库之Support event trigger for logoff

目录结构 注&#xff1a;提前言明 本文借鉴了以下博主、书籍或网站的内容&#xff0c;其列表如下&#xff1a; 1、参考书籍&#xff1a;《PostgreSQL数据库内核分析》 2、参考书籍&#xff1a;《数据库事务处理的艺术&#xff1a;事务管理与并发控制》 3、PostgreSQL数据库仓库…

VirtualBox7安装ubantu server 22.04通过NAT+Only-Host双网卡实现宿主机与虚拟机互通

目录 背景环境安装虚拟机配置网卡修改ssh端口遇到的坑参考文章 背景 时间长没用docker了&#xff0c;有些命令都快忘了&#xff0c;心血来潮想着搞个docker玩一玩&#xff0c;所以需要先搞一个虚拟机&#xff0c;因为之前CentOS用的比较多&#xff0c;所以这次想试一试ubantu。…

『大模型笔记』AI教母李飞飞谈人工智能的前景与危险!

AI教母李飞飞谈人工智能的前景与危险! 文章目录 一. AI教母李飞飞谈人工智能的前景与危险!1. 总结2. 全文内容二. 参考文献油管原视频:https://www.youtube.com/watch?v=FW5CypL1XOY一. AI教母李飞飞谈人工智能的前景与危险! 1. 总结 以下是整理后的中文内容: 李飞飞博…

openlayers实现绘制图标,并实现图标的聚合功能

点聚合说明 点聚合功能是指将地图上密集的点数据聚合成一个更大的点或者其他形状&#xff0c;以改善地图的可视化效果和性能。点聚合功能通常用于在地图上显示大量的点标记&#xff0c;例如地图上的POI&#xff08;兴趣点&#xff09;、传感器数据等。通过点聚合功能&#xff…

Vue3 - 修改浏览器标题 htmlWebpackPlugin.options.title 的值

在 Vue CLI 4.x 中&#xff0c;htmlWebpackPlugin.options.title 是 HtmlWebpackPlugin 的一个选项&#xff0c;用于设置生成的 HTML 文件的标题。 你可以通过修改 vue.config.js 文件来修改这个选项。 以下是一个示例&#xff1a; module.exports {chainWebpack: config &…

[单机]成吉思汗3_GM工具_VM虚拟机

稀有端游成吉思汗1,2,3单机版虚拟机一键端完整版 本教程仅限学习使用&#xff0c;禁止商用&#xff0c;一切后果与本人无关&#xff0c;此声明具有法律效应&#xff01;&#xff01;&#xff01;&#xff01; 教程是本人亲自搭建成功的&#xff0c;绝对是完整可运行的&#x…

[算法][数组][leetcode]2391. 收集垃圾的最少总时间

题目地址: https://leetcode.cn/problems/minimum-amount-of-time-to-collect-garbage/description/ 题解&#xff1a; class Solution {public int garbageCollection(String[] garbage, int[] travel) {int ans 0;//先计算收所有的垃圾需要多少时间for(String s :garbage){…

D - Another Sigma Problem(ABC)

思路&#xff1a;我们可以处理一个后缀来记录当前数a[i]需要乘上多少&#xff08;类似于1110这样的&#xff09;&#xff0c;然后对于当前位来说&#xff0c;对答案的贡献还要加上(i - 1) * a[i]&#xff0c;因为a[i]还要做前(i - 1)个数的后缀。 代码&#xff1a; #include &…

目标检测YOLO实战应用案例100讲-无监督领域自适应目标检测方法研究与应用(五)

目录 多源无监督领域自适应目标检测方法 4.1研究现状及问题形成 4.2相关工作详述

在Chisel中,`+%`运算符 模运算加法的妙用

在Chisel中&#xff0c;%是一个特殊的运算符&#xff0c;用于执行加法操作并且处理可能的溢出。这个运算符在硬件设计中很有用&#xff0c;因为它允许开发者明确控制当数值超出其表示范围时的行为。 加法和模运算加法 普通加法&#xff1a;在大多数编程语言和硬件描述语言中&…

【详细介绍下Visual Studio】

&#x1f3a5;博主&#xff1a;程序员不想YY啊 &#x1f4ab;CSDN优质创作者&#xff0c;CSDN实力新星&#xff0c;CSDN博客专家 &#x1f917;点赞&#x1f388;收藏⭐再看&#x1f4ab;养成习惯 ✨希望本文对您有所裨益&#xff0c;如有不足之处&#xff0c;欢迎在评论区提出…

vue3文件上传

样式&#xff1a; 可随意&#xff0c;通过获取组件toWake()方法即可 实现功能&#xff1a; 限制上传文件类型 限制上传文件大小 组件名称&#xff1a; autoUpload 实现代码: <!-- 通用文件上传按钮&#xff0c;解决原生样式无法修改问题 --> <!-- 参数介绍(可拓展…

Ubuntu24安装搜狗输入法,修复闪屏问题

下载deb安装包&#xff1a;搜狗输入法linux-首页 安装&#xff1a;sudo dpkg -i 1.deb 搜狗输入法linux-安装指导 重启&#xff0c;但是完成后闪烁。按以下步骤更改桌面配置。 sudo gedit /etc/gdm3/custom.conf 取消WaylandEnable的注释即可