力扣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]

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

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

相关文章

MAUI APP开发蓝牙协议的经验分享:与跳绳设备对接

在开发MAUI应用程序时&#xff0c;蓝牙协议的应用是一个重要的环节&#xff0c;尤其是在需要与外部设备如智能跳绳进行数据交换的场景中。以下是我在开发过程中的一些经验和心得&#xff0c;希望能为你的项目提供帮助。 1. 蓝牙协议基础 蓝牙协议是无线通信的一种标准&#x…

Vector软件CANdb++的信号起始位Bug

问题现象 前几天导入DBC文件发现不对劲&#xff0c;怎么生成代码的起始地址都怪怪的&#xff0c;检查下工程里面的配置&#xff0c;还真的是这样&#xff0c;一路查到输入文件——DBC文件&#xff0c;发现是DBC文件就有错误&#xff1a;一些CAN报文之后8字节长度&#xff0c;也…

Qt 面试题学习12_2024-11-30

Qt 面试题 1、描述Qt的TCP通讯流程2、自定义控件流程3、什么是Qt的插件机制 &#xff1f; 1、描述Qt的TCP通讯流程 服务端&#xff08;QTcpServer&#xff09; 1、创建TcpServer对象 2、使用listen()方法将服务器绑定到本地地址和端口 3、当有新的客户端连接成功发送newConnec…

2022-12-4----Android11(H713m)---- WiFi驱动添加写入mac号补丁

一、问题 用全志的写号工具&#xff0c;写入wifi_mac&#xff0c;设置下边不生效 二、分析 因为我们的WiFi不是用全志平台的&#xff0c;也不是用全志集成好的&#xff0c;而是用希微这家第三方的WiFi/BT&#xff0c;所以该驱动还没完善。 三、修改前的准备 用写号工具写号…

网站维护记录

服务器重启&#xff0c;网站打不开&#xff1a;chown -R manager:manager /run/php-fpm/www.sock wordpress升级需设置ftp&#xff1a; // 设置权限0777 //define("FS_METHOD", "direct"); //define("FS_CHMOD_DIR", 0777); //define("…

单端和差分信号的接线法

内容来源&#xff1a;【单端信号 差分信号与数据采集卡的【RSE】【 NRES】【 DIFF】 模式的连接】 此篇文章仅作笔记分享。 单端输入 单端信号指的是输入信号由一个参考端和一个信号端构成&#xff0c;参考端一般是地端&#xff0c;信号就是通过计算信号端口和地端的差值所得…

C++——名字遮蔽与类的作用域

C 类的作用域以及继承的特殊关系 名字遮蔽与类的作用域继承的特殊关系 名字遮蔽与类的作用域 如果派生类中的成员&#xff08;包括成员变量和成员函数&#xff09;和基类中的成员重名&#xff0c;通过派生类对象或者在派生类的成员函数中使用该成员时&#xff0c;将使用派生类…

Solana VS 以太坊:基于数据、市场情绪和催化剂对比分析,Solana 能否实现逆袭?

2023年&#xff0c;加密货币市场再度迎来了波动与重塑。在这一轮周期中&#xff0c;Solana&#xff08;SOL&#xff09;凭借其强劲的价格表现和创新的技术架构&#xff0c;成为市场的焦点之一。SOL的价格从2022年12月的低点一路飙升&#xff0c;甚至创下了历史新高264 USDT&…

Mac安装MINIO服务器实现本地上传和下载服务

0.MINIO学习文档 Minio客户端mc使用 | Elibaron学习笔记 1.Mac安装MINIO 中文官方网址&#xff1a;MinIO下载和安装 | 用于创建高性能对象存储的代码和下载内容 (1) brew 安装 brew install minio/stable/minio &#xff08;2&#xff09;安装完成&#xff0c;执行brew i…

el-table 组件二次封装(vue2)

PublicTable.vue <!-- 公共表格组件 --> <template><div class"table-common"><el-table v-loading"loading" :ref"tableid" border style"width: 100%" :data"tableDatas" :row-key"rowKey&quo…

pgsql指令、pg在docker中打开

常规 linux 在安装pgsql的服务器上 root是用户名&#xff0c;test是数据库名 psql -U root -d test登录后显示&#xff0c;12,6是版本号 psql (12.6) 查询所有表 \dt查询表结构 \d table_name查询表所属 \dp manual_logistics_logSELECT n.nspname AS table_schema,c.re…

alpine openssl 编译

./config no-shared --prefix/usr/local/openssl apk add musl-dev gcc g apk add linux-headers ssh root 登录 编辑 SSH 配置文件 打开 SSH 配置文件 /etc/ssh/sshd_config&#xff1a; vi /etc/ssh/sshd_config PermitRootLogin yes

一文解决数据库【事务】相关问题

文章目录 前言一、事务的基本概念二、ACID 特性1.原子性&#xff08;Atomicity&#xff09;2.一致性&#xff08;Consistency&#xff09;3.隔离性&#xff08;Isolation&#xff09;4.持久性&#xff08;Durability&#xff09; 三、事务的操作1.开始事务&#xff08;BEGIN TR…

Mac苹果电脑 java前后端开发环境及软件安装教程

本文记录我初次使用macOS系统&#xff0c;m4 mini安装开发软件及环境的全过程&#xff0c;希望能帮助到你&#xff0c;好用的请点赞评论收藏增加热度&#xff0c;让更多Mac小白轻松体验开发&#xff0c;20241129 …

dfs—acwing

题目一&#xff1a;排序数字 842. 排列数字 - AcWing题库 分析 考虑dfs&#xff0c;其实stl——next_permutation也可以 路径存储开一个数组&#xff0c;不能重复搜索&#xff0c;加一个标记数组 代码 #include<bits/stdc.h> using namespace std;int path[10]; int…

一步一步写线程之十六线程的安全退出之一理论分析

一、多线程的开发 多线程的开发&#xff0c;在实际场景中几乎是无法避开的。即使是前端看似没有使用线程&#xff0c;其实在底层的框架中也使用了线程进行了支撑。至少到现在&#xff0c;不管是协程还是其它什么新的编程方式&#xff0c;仍然无法撼动线程的主流地位。 多线程的…

ISAAC SIM踩坑记录--添加第三方3D场景

ISAAC SIM仿真首先就是要有合适的3D场景&#xff0c;官方提供了一些场景&#xff0c;如果不能满足要求&#xff0c;那就只能自己建。 对于我这种不会3D建模的菜鸟&#xff0c;只能到网上下载了&#xff0c;sketchfab就是一个不错的平台&#xff0c;有不少免费资源可以下载。 …

人工智能_大模型091_大模型工作流001_使用工作流的原因_处理复杂问题_多轮自我反思优化ReAct_COT思维链---人工智能工作笔记0236

# 清理环境信息&#xff0c;与上课内容无关 import os os.environ["LANGCHAIN_PROJECT"] "" os.environ["LANGCHAIN_API_KEY"] "" os.environ["LANGCHAIN_ENDPOINT"] "" os.environ["LANGCHAIN_TRACING_V…

完全按照手册win10里装Ubuntu 虚拟机然后编译ESP32(主要是想针对ESP32C3和S3)开发板的鸿蒙系统(失败)

基本上完全按照手册来的&#xff0c;除了Ubuntu虚拟机使用了22.04 Jammy版本&#xff0c;鸿蒙手册里是20.04 版本&#xff0c;主要是鸿蒙里3年前的手册了&#xff0c;所以就擅自用了高版本。 据此还想到一点&#xff0c;鸿蒙LiteOS&#xff0c;还挺稳定的&#xff0c;3年也没有…

一文理解多模态大语言模型——下

作者&#xff1a;Sebastian Raschka 博士&#xff0c; 翻译&#xff1a;张晶&#xff0c;Linux Fundation APAC Open Source Evangelist 编者按&#xff1a;本文并不是逐字逐句翻译&#xff0c;而是以更有利于中文读者理解的目标&#xff0c;做了删减、重构和意译&#xff0c…