当前位置: 首页 > news >正文

力扣88题:合并两个有序数组

力扣88题:合并两个有序数组

题目描述

给定两个按非递减顺序排列的整数数组 nums1nums2,以及它们的长度 mn,要求将 nums2 合并到 nums1,使得合并后的数组仍按非递减顺序排列。

输入与输出

示例 1

输入:nums1 = [1,2,3,0,0,0], m = 3nums2 = [2,5,6], n = 3
输出:[1,2,2,3,5,6]

示例 2

输入:nums1 = [1], m = 1nums2 = [], n = 0
输出:[1]

示例 3

输入:nums1 = [0], m = 0nums2 = [1], n = 1
输出:[1]

算法思路

1. 问题分析

题目要求我们原地合并两个数组:

  • nums1 的后半部分预留了足够的空间(大小为 m + n m + n m+n)。
  • nums1nums2 已经是有序的。

2. 双指针逆向合并

我们从两个数组的尾部开始比较,选择较大的元素放入 nums1 的末尾。具体步骤如下:

2.1 初始化指针
  • 定义指针 p1:指向 nums1 的有效元素的末尾(即索引 m − 1 m - 1 m1)。
  • 定义指针 p2:指向 nums2 的末尾(即索引 n − 1 n - 1 n1)。
  • 定义指针 p:指向 nums1 的总末尾(即索引 m + n − 1 m + n - 1 m+n1)。
2.2 比较与插入
  • 如果 nums1[p1] > nums2[p2],将 nums1[p1] 放入 nums1[p],并移动 p1p
  • 如果 nums1[p1] <= nums2[p2],将 nums2[p2] 放入 nums1[p],并移动 p2p
2.3 拷贝剩余元素
  • 如果 nums2 中还有未处理的元素,直接将它们拷贝到 nums1 的前面。
  • 如果 nums1 中还有未处理的元素,则无需额外操作。
2.4 循环终止条件
  • p1 < 0p2 < 0 时,循环结束。

代码实现

以下是修正后的完整代码:

void merge(int* nums1, int nums1Size, int m, int* nums2, int nums2Size, int n) {int i = nums1Size - 1; // 从 nums1 的尾部开始填充while (m > 0 || n > 0) {if (n > 0 && (m == 0 || nums1[m - 1] < nums2[n - 1])) {nums1[i--] = nums2[--n];} else {nums1[i--] = nums1[--m];}}
}

代码详解

1. 初始化指针

定义三个指针:

  • p1 = m - 1:指向 nums1 有效部分的末尾。
  • p2 = n - 1:指向 nums2 的末尾。
  • p = m + n - 1:指向 nums1 的尾部。

2. 从尾部向前合并

通过比较 nums1[p1]nums2[p2],将较大的元素放入 nums1[p],并更新指针。以下是操作逻辑:

if (n > 0 && (m == 0 || nums1[m - 1] < nums2[n - 1])) {nums1[p--] = nums2[--n];
} else {nums1[p--] = nums1[--m];
}

3. 拷贝剩余的 nums2

如果 nums2 中还有未处理的元素,直接拷贝:

while (n > 0) {nums1[p--] = nums2[--n];
}

复杂度分析

时间复杂度

  • 遍历数组时,每次比较、移动只需 O ( 1 ) O(1) O(1) 时间,总体复杂度为 O ( m + n ) O(m + n) O(m+n)

空间复杂度

  • 使用了常量级的额外空间,复杂度为 O ( 1 ) O(1) O(1)

测试用例

测试用例 1

输入

nums1 = [1,2,3,0,0,0], m = 3
nums2 = [2,5,6], n = 3

输出

[1,2,2,3,5,6]

测试用例 2

输入

nums1 = [1], m = 1
nums2 = [], n = 0

输出

[1]

测试用例 3

输入

nums1 = [0], m = 0
nums2 = [1], n = 1

输出

[1]

测试用例 4

输入

nums1 = [2,2,2,0,0,0], m = 3
nums2 = [2,2,2], n = 3

输出

[2,2,2,2,2,2]

相关文章:

力扣88题:合并两个有序数组

力扣88题&#xff1a;合并两个有序数组 题目描述 给定两个按非递减顺序排列的整数数组 nums1 和 nums2&#xff0c;以及它们的长度 m 和 n&#xff0c;要求将 nums2 合并到 nums1&#xff0c;使得合并后的数组仍按非递减顺序排列。 输入与输出 示例 1&#xff1a; 输入&am…...

python 笔记之线程同步和死锁

同步&#xff1a; 共享数据&#xff1a; 如果多个线程共同对某个数据修改&#xff0c;则可能出现不可预测的结果&#xff0c;为了保证数据的正确性&#xff0c;需要对多个数据进行同步 同步&#xff1a;一个一个的完成&#xff0c;一个做完另一个才能进来 效率会降低 使用Thre…...

SpringBoot小知识(4):高级配置知识与bean的绑定

一、EnableConfigurationProperties ConfigurationProperties注解在我们之前讲过&#xff0c;他是从配置中读取参数封装给实体类的一个注解。 那么EnableConfigurationProperties是个啥呢&#xff1f; EnableConfigurationProperties 是 Spring Framework 中用于启用基于配置文…...

Python毕业设计选题:基于大数据的淘宝电子产品数据分析的设计与实现-django+spark+spider

开发语言&#xff1a;Python框架&#xff1a;djangoPython版本&#xff1a;python3.7.7数据库&#xff1a;mysql 5.7数据库工具&#xff1a;Navicat11开发软件&#xff1a;PyCharm 系统展示 管理员登录 管理员功能界面 电子产品管理 系统管理 数据可视化分析看板展示 摘要 本…...

Lua面向对象实现

Lua中的面向对象是通过表&#xff08;table&#xff09;来模拟类实现的&#xff0c;通过setmetatable(table,metatable)方法&#xff0c;将一个表设置为当前表的元表&#xff0c;之后在调用当前表没有的方法或者键时&#xff0c;会再查询元表中的方法和键&#xff0c;以此来实现…...

OpenCV的圆形检测‌HoughCircles

HoughCircles 函数是 OpenCV 库中用于在灰度图像中检测圆的函数,它基于霍夫变换(Hough Transform)的一种变体——梯度霍夫变换(HOUGH_GRADIENT)函数原型如下: void HoughCircles( InputArray image, OutputArray circles,int method, double dp, double minDist,double …...

iOS视图控制器的生命周期及各阶段的作用

iOS视图控制器&#xff08;UIViewController&#xff09;的生命周期是指从它被创建到最终被销毁的过程中所经历的一系列阶段。每个阶段都有其特定的作用和执行时机&#xff0c;这些阶段和作用对于开发高效、稳定的iOS应用至关重要。以下是iOS视图控制器的生命周期及其各个阶段的…...

四轮阿克曼(前轮转向、后轮驱动)车子仿真控制

目录 写在前面的话调用 libgazebo_ros_ackermann_drive.so 插件属性介绍补充 steering_wheel_joint 配置键盘控制命令 结果演示 写在前面的话 这里增加一个四轮阿克曼&#xff08;前轮转向、后轮驱动&#xff09;车子仿真控制的版本&#xff0c;使用的事gazebo的插件 参考资料…...

Blender均匀放缩模型

解决办法&#xff1a; 首先选中模型&#xff0c;按下“s”键&#xff0c;如下图所示&#xff0c;此时模型根据鼠标的移动放缩 或者在按下“s”后输入数值&#xff0c;再按回车键Enter&#xff0c;模型会根据你该数值进行均匀放缩 指定放大2倍结果——...

Python基于 Opencv+wxPython 的人脸识别上课考勤系统,附源码

博主介绍&#xff1a;✌程序员徐师兄、7年大厂程序员经历。全网粉丝12w、csdn博客专家、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和毕业项目实战✌ &#x1f345;文末获取源码联系&#x1f345; &#x1f447;&#x1f3fb; 精彩专栏推荐订阅&#x1f447;…...

【AI工具】强大的AI编辑器Cursor详细使用教程

目录 一、下载安装与注册 二、内置模型与配置 三、常用快捷键 四、项目开发与问答 五、注意事项与技巧 参考资料 近日&#xff0c;由四名麻省理工学院&#xff08;MIT&#xff09;本科生共同创立的Anysphere公司宣布&#xff0c;其开发的AI代码编辑器Cursor在成立短短两年…...

DApp开发与APP开发的五大区别

随着比特币与区块链技术的不断发展&#xff0c;DApp应用会逐渐成为主流。与APPAPP相比&#xff0c;DApp有许多不同之处&#xff0c;尤其是在架构、数据存储、用户隐私等方面。本文将通过五大关键点&#xff0c;深入探讨DApp开发与APP开发之间的主要区别。 1. 后端架构&#xff…...

哪款云手机适合多开?常用云手机功能对比

在全球化和数字化时代&#xff0c;云手机以其独特的灵活性和高效性&#xff0c;成为多账号运营和数字营销的热门工具。云手机能够解决传统设备管理的诸多痛点&#xff0c;例如账号关联、硬件成本高等问题。本文将为您推荐多款优质云手机品牌&#xff0c;帮助您选择最适合的工具…...

Python几种常用数据结构(重制版)

一、列表 [List] 定义&#xff1a;有序可重复的数据集合。示例&#xff1a;my_list [element1, element2, element3]增加元素方法&#xff1a; append()&#xff1a;在列表末尾增加单个元素&#xff08;列表特有方法&#xff09;&#xff0c;例如 my_list.append(element)。e…...

C++ 游戏开发:开启游戏世界的编程之旅(2)

三、游戏输入处理 &#xff08;一&#xff09;键盘输入处理 在游戏中&#xff0c;玩家通过键盘输入来控制角色的行动。我们需要在游戏循环中不断检测键盘事件&#xff0c;并根据不同的按键按下或松开状态来执行相应的操作。例如&#xff0c;在 SDL 中&#xff0c;可以这样处理…...

用 Python 做数据分析需要掌握哪些基础?

用 Python 做数据分析&#xff0c;需要掌握以下几个基础方面&#xff1a; 1. Python 编程基础 语法基础&#xff1a;变量、数据类型&#xff08;如字符串、整数、浮点数、布尔值&#xff09;、条件语句&#xff08;if-else&#xff09;、循环&#xff08;for、while&#xff0…...

UE5 像素流进行内网https证书创建

确定证书需求 内网 HTTPS 通信通常需要以下内容&#xff1a; 自签名证书&#xff08;适用于内网环境&#xff0c;不需要通过公开的证书颁发机构 CA&#xff09; 或者通过内部的企业 CA 签发的证书&#xff08;更安全&#xff09;。 生成自签名证书 使用工具&#xff08;如 Ope…...

Envoy-istio

最近研究envoy-istio&#xff0c;发现这个博客&#xff0c;觉得很不错&#xff0c;这里记录一下 envoy-istio介绍 envoy-istio - 随笔分类 - yaowx - 博客园 envoy部分七&#xff1a;envoy的http流量管理基础 envoy部分六&#xff1a;envoy的集群管理 envoy部分五&#xff…...

CTF-PWN: WEB_and_PWN [第一届“吾杯”网络安全技能大赛 Calculator] 赛后学习(不会)

附件 calculate.html <!DOCTYPE html> <html lang"en"> <head><!-- 设置字符编码为 UTF-8&#xff0c;支持多语言字符集 --><meta charset"UTF-8"><!-- 设置响应式视图&#xff0c;确保页面在不同设备上自适应显示 --&…...

【数据结构与算法】排序算法(上)——插入排序与选择排序

文章目录 一、常见的排序算法二、插入排序2.1、直接插入排序2.2、希尔排序( 缩小增量排序 ) 三、选择排序3.1、直接选择排序3.2、堆排序3.2.1、堆排序的代码实现 一、常见的排序算法 常见排序算法中有四大排序算法&#xff0c;第一是插入排序&#xff0c;二是选择排序&#xff…...

嵌入式通用软件包ToolKit:跨平台模块化设计与工程实践

1. 项目概述&#xff1a;为什么我们需要一个“嵌入式通用软件包”&#xff1f;在嵌入式开发这个行当里摸爬滚打了十几年&#xff0c;我最大的感受就是“重复造轮子”和“碎片化”是效率的两大杀手。你想想看&#xff0c;是不是每个新项目启动&#xff0c;都得重新搭建一遍日志系…...

嵌入式开发通用工具包设计:模块化、可裁剪与高性能实现

1. 项目概述&#xff1a;为什么嵌入式开发需要一个“瑞士军刀”&#xff1f;在嵌入式开发的日常里&#xff0c;我猜你和我一样&#xff0c;经常在重复造轮子。比如&#xff0c;今天在A项目里写了个精巧的CRC校验函数&#xff0c;明天在B项目里又要处理环形缓冲区&#xff0c;后…...

工业 CAN 通信利器!六通道隔离集线器,中继滤波稳组网

工业 CAN 总线距离受限、速率不匹配、数据拥堵、故障难排查&#xff1f;三格电子SG-CanHub-600 六通道 CAN 集线器&#xff0c;工业级隔离中继&#xff0c;信号再生 智能滤波&#xff0c;轻松解决 CAN 网络通信难题&#xff01;⚙️ 硬核实力&#xff0c;工业通信强支撑✅ 六通…...

Tonzhon音乐:纯净无干扰的现代音乐播放平台终极指南

Tonzhon音乐&#xff1a;纯净无干扰的现代音乐播放平台终极指南 【免费下载链接】tonzhon-music 铜钟 Tonzhon (tonzhon.whamon.com): 干净纯粹的音乐平台 (铜钟已不再使用 tonzhon.com&#xff0c;现在的 tonzhon.com 不是正版的铜钟) 项目地址: https://gitcode.com/GitHub…...

终极智慧树刷课插件指南:如何实现自动化高效学习

终极智慧树刷课插件指南&#xff1a;如何实现自动化高效学习 【免费下载链接】zhihuishu 智慧树刷课插件&#xff0c;自动播放下一集、1.5倍速度、无声 项目地址: https://gitcode.com/gh_mirrors/zh/zhihuishu 还在为智慧树平台枯燥的手动操作而烦恼吗&#xff1f;智慧…...

仪式感,从来与你无关

2.2万人点赞的扎心评论:仪式感,从来都与你无关 有2.2万个男生偷偷点了赞。 没有歇斯底里的控诉,没有长篇大论的抱怨,只有一句轻飘飘的陈述,和一句"兄弟,没绷住"。 但就是这两句话,像一根针,精准地扎破了无数男生藏在心里最深处的、不敢说出口的委屈。 01…...

Java 后端转 AI 应用开发,我发现真正的机会不在算法,而在落地

普通 Java 后端转 AI 应用开发&#xff0c;不要一开始就被算法、论文、训练大模型吓住。大多数企业真正需要的&#xff0c;是有人能把大模型接入业务、接入数据、接入权限、接入流程&#xff0c;并且让系统稳定上线。一、先说结论&#xff1a;AI 应用开发&#xff0c;不等于训练…...

Unity接入Google Play Games完整避坑指南

1. 这不是“接个SDK”那么简单&#xff1a;为什么Unity项目接入Google Play Games常卡在第三步就崩了你肯定见过那种教程——标题写着“三分钟接入Google Play Games”&#xff0c;点进去第一行就是“下载插件、拖进Assets、调用PlayGamesPlatform.Activate()”&#xff0c;然后…...

共聚焦vs触针 :表面粗糙度测量原理及ISO25178兼容性分析

表面粗糙度测量是精密制造和质量控制的核心环节&#xff0c;直接影响产品耐磨性、摩擦性能及使用寿命。在工业和科研应用中&#xff0c;准确测量Ra参数不仅保证零件性能稳定&#xff0c;还满足ISO25178标准和ISO4287标准等国际标准要求。传统触针仪器虽然精度高&#xff0c;但操…...

2026年JAVA语言前端还可以学吗?是否还能找到好工作?

因为Java并不是前端语言。前端开发主要用的是 HTML、CSS、JavaScript/TypeScript&#xff0c;以及 React、Vue 等框架。可能您是混淆了 Java 和 JavaScript&#xff0c;或者想问的是“学 Java 还能找到好工作吗&#xff1f;前端还能学吗&#xff1f;” 下面我分开讲清楚&#x…...