力扣88题:合并两个有序数组
力扣88题:合并两个有序数组
题目描述
给定两个按非递减顺序排列的整数数组 nums1 和 nums2,以及它们的长度 m 和 n,要求将 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)。nums1和nums2已经是有序的。
2. 双指针逆向合并
我们从两个数组的尾部开始比较,选择较大的元素放入 nums1 的末尾。具体步骤如下:
2.1 初始化指针
- 定义指针
p1:指向nums1的有效元素的末尾(即索引 m − 1 m - 1 m−1)。 - 定义指针
p2:指向nums2的末尾(即索引 n − 1 n - 1 n−1)。 - 定义指针
p:指向nums1的总末尾(即索引 m + n − 1 m + n - 1 m+n−1)。
2.2 比较与插入
- 如果
nums1[p1] > nums2[p2],将nums1[p1]放入nums1[p],并移动p1和p。 - 如果
nums1[p1] <= nums2[p2],将nums2[p2]放入nums1[p],并移动p2和p。
2.3 拷贝剩余元素
- 如果
nums2中还有未处理的元素,直接将它们拷贝到nums1的前面。 - 如果
nums1中还有未处理的元素,则无需额外操作。
2.4 循环终止条件
- 当
p1 < 0且p2 < 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题:合并两个有序数组 题目描述 给定两个按非递减顺序排列的整数数组 nums1 和 nums2,以及它们的长度 m 和 n,要求将 nums2 合并到 nums1,使得合并后的数组仍按非递减顺序排列。 输入与输出 示例 1: 输入&am…...
python 笔记之线程同步和死锁
同步: 共享数据: 如果多个线程共同对某个数据修改,则可能出现不可预测的结果,为了保证数据的正确性,需要对多个数据进行同步 同步:一个一个的完成,一个做完另一个才能进来 效率会降低 使用Thre…...
SpringBoot小知识(4):高级配置知识与bean的绑定
一、EnableConfigurationProperties ConfigurationProperties注解在我们之前讲过,他是从配置中读取参数封装给实体类的一个注解。 那么EnableConfigurationProperties是个啥呢? EnableConfigurationProperties 是 Spring Framework 中用于启用基于配置文…...
Python毕业设计选题:基于大数据的淘宝电子产品数据分析的设计与实现-django+spark+spider
开发语言:Python框架:djangoPython版本:python3.7.7数据库:mysql 5.7数据库工具:Navicat11开发软件:PyCharm 系统展示 管理员登录 管理员功能界面 电子产品管理 系统管理 数据可视化分析看板展示 摘要 本…...
Lua面向对象实现
Lua中的面向对象是通过表(table)来模拟类实现的,通过setmetatable(table,metatable)方法,将一个表设置为当前表的元表,之后在调用当前表没有的方法或者键时,会再查询元表中的方法和键,以此来实现…...
OpenCV的圆形检测HoughCircles
HoughCircles 函数是 OpenCV 库中用于在灰度图像中检测圆的函数,它基于霍夫变换(Hough Transform)的一种变体——梯度霍夫变换(HOUGH_GRADIENT)函数原型如下: void HoughCircles( InputArray image, OutputArray circles,int method, double dp, double minDist,double …...
iOS视图控制器的生命周期及各阶段的作用
iOS视图控制器(UIViewController)的生命周期是指从它被创建到最终被销毁的过程中所经历的一系列阶段。每个阶段都有其特定的作用和执行时机,这些阶段和作用对于开发高效、稳定的iOS应用至关重要。以下是iOS视图控制器的生命周期及其各个阶段的…...
四轮阿克曼(前轮转向、后轮驱动)车子仿真控制
目录 写在前面的话调用 libgazebo_ros_ackermann_drive.so 插件属性介绍补充 steering_wheel_joint 配置键盘控制命令 结果演示 写在前面的话 这里增加一个四轮阿克曼(前轮转向、后轮驱动)车子仿真控制的版本,使用的事gazebo的插件 参考资料…...
Blender均匀放缩模型
解决办法: 首先选中模型,按下“s”键,如下图所示,此时模型根据鼠标的移动放缩 或者在按下“s”后输入数值,再按回车键Enter,模型会根据你该数值进行均匀放缩 指定放大2倍结果——...
Python基于 Opencv+wxPython 的人脸识别上课考勤系统,附源码
博主介绍:✌程序员徐师兄、7年大厂程序员经历。全网粉丝12w、csdn博客专家、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和毕业项目实战✌ 🍅文末获取源码联系🍅 👇🏻 精彩专栏推荐订阅👇…...
【AI工具】强大的AI编辑器Cursor详细使用教程
目录 一、下载安装与注册 二、内置模型与配置 三、常用快捷键 四、项目开发与问答 五、注意事项与技巧 参考资料 近日,由四名麻省理工学院(MIT)本科生共同创立的Anysphere公司宣布,其开发的AI代码编辑器Cursor在成立短短两年…...
DApp开发与APP开发的五大区别
随着比特币与区块链技术的不断发展,DApp应用会逐渐成为主流。与APPAPP相比,DApp有许多不同之处,尤其是在架构、数据存储、用户隐私等方面。本文将通过五大关键点,深入探讨DApp开发与APP开发之间的主要区别。 1. 后端架构ÿ…...
哪款云手机适合多开?常用云手机功能对比
在全球化和数字化时代,云手机以其独特的灵活性和高效性,成为多账号运营和数字营销的热门工具。云手机能够解决传统设备管理的诸多痛点,例如账号关联、硬件成本高等问题。本文将为您推荐多款优质云手机品牌,帮助您选择最适合的工具…...
Python几种常用数据结构(重制版)
一、列表 [List] 定义:有序可重复的数据集合。示例:my_list [element1, element2, element3]增加元素方法: append():在列表末尾增加单个元素(列表特有方法),例如 my_list.append(element)。e…...
C++ 游戏开发:开启游戏世界的编程之旅(2)
三、游戏输入处理 (一)键盘输入处理 在游戏中,玩家通过键盘输入来控制角色的行动。我们需要在游戏循环中不断检测键盘事件,并根据不同的按键按下或松开状态来执行相应的操作。例如,在 SDL 中,可以这样处理…...
用 Python 做数据分析需要掌握哪些基础?
用 Python 做数据分析,需要掌握以下几个基础方面: 1. Python 编程基础 语法基础:变量、数据类型(如字符串、整数、浮点数、布尔值)、条件语句(if-else)、循环(for、while࿰…...
UE5 像素流进行内网https证书创建
确定证书需求 内网 HTTPS 通信通常需要以下内容: 自签名证书(适用于内网环境,不需要通过公开的证书颁发机构 CA) 或者通过内部的企业 CA 签发的证书(更安全)。 生成自签名证书 使用工具(如 Ope…...
Envoy-istio
最近研究envoy-istio,发现这个博客,觉得很不错,这里记录一下 envoy-istio介绍 envoy-istio - 随笔分类 - yaowx - 博客园 envoy部分七:envoy的http流量管理基础 envoy部分六:envoy的集群管理 envoy部分五ÿ…...
CTF-PWN: WEB_and_PWN [第一届“吾杯”网络安全技能大赛 Calculator] 赛后学习(不会)
附件 calculate.html <!DOCTYPE html> <html lang"en"> <head><!-- 设置字符编码为 UTF-8,支持多语言字符集 --><meta charset"UTF-8"><!-- 设置响应式视图,确保页面在不同设备上自适应显示 --&…...
【数据结构与算法】排序算法(上)——插入排序与选择排序
文章目录 一、常见的排序算法二、插入排序2.1、直接插入排序2.2、希尔排序( 缩小增量排序 ) 三、选择排序3.1、直接选择排序3.2、堆排序3.2.1、堆排序的代码实现 一、常见的排序算法 常见排序算法中有四大排序算法,第一是插入排序,二是选择排序ÿ…...
TouchGal终极指南:打造纯净Galgame社区的完整解决方案
TouchGal终极指南:打造纯净Galgame社区的完整解决方案 【免费下载链接】kun-touchgal-next TouchGAL是立足于分享快乐的一站式Galgame文化社区, 为Gal爱好者提供一片净土! 项目地址: https://gitcode.com/gh_mirrors/ku/kun-touchgal-next TouchGal是一个专为…...
TOAST UI Chart仪表盘开发终极指南:Gauge图表在企业监控中的完整应用方案
TOAST UI Chart仪表盘开发终极指南:Gauge图表在企业监控中的完整应用方案 【免费下载链接】tui.chart 🍞📊 Beautiful chart for data visualization. 项目地址: https://gitcode.com/gh_mirrors/tu/tui.chart TOAST UI Chart仪表盘开…...
C语言完美演绎6-17
/* 范例:6-17 */#include <stdio.h>#include <conio.h>int main(){int a;printf("请输入你的分数(0-100)");scanf("%d",&a);if(a>0) if(a<100) printf("你输入的分数…...
新手入门:借助快马AI生成lostlife交互示例学习前端开发
作为一个刚接触前端开发的新手,我最近想尝试做一个简单的网页互动项目。在网上看到类似lostlife这样的互动游戏后,特别想了解它们是如何实现基础交互功能的。经过一番摸索,我发现用InsCode(快马)平台可以很轻松地实现这个想法,下面…...
ESP8266 wroom_02 AT固件烧录全攻略:从工具选择到同步下载问题解决
1. ESP8266 wroom_02模块与AT固件基础认知 第一次接触ESP8266 wroom_02模块的朋友可能会被各种专业术语搞晕。简单来说,这个火柴盒大小的模块就是物联网设备的"大脑",而AT固件则是让它听懂人类指令的"语言系统"。我当年第一次用这个…...
[LaTeX] 使用minipage与subfigure实现高效多图排版(附代码型图片处理技巧)
1. 为什么需要minipage和subfigure? 写论文或者技术文档时,经常遇到需要把多张图片并排展示的情况。比如对比实验效果图、不同角度的产品展示、代码片段对比等。传统做法是每张图单独插入,但这样会导致图片间距不一致、对齐困难,最…...
DETR训练避坑大全:Windows10+PyCharm环境下的5个常见报错解决方案
DETR实战指南:Windows 10环境下的5大典型问题深度解析与解决方案 在目标检测领域,DETR(Detection Transformer)作为首个完全基于Transformer架构的端到端检测系统,正在改变传统计算机视觉任务的实现方式。不同于Faste…...
LeetCode 删除无效的括号:python 题解
简介 AI Agent 不仅仅是一个能聊天的机器人(如普通的 ChatGPT),而是一个能够感知环境、进行推理、自主决策并调用工具来完成特定任务的智能系统,更够完成更为复杂的AI场景需求。 AI Agent 功能 根据查阅的资料,agent的…...
校园网环境下树莓派与Windows直连SSH的实战指南
1. 为什么需要网线直连树莓派? 在校园网环境下使用树莓派时,很多同学都会遇到这样的困扰:宿舍里没有路由器,校园WiFi又需要复杂的认证,根本无法让树莓派联网。这时候,一根普通的网线就能解决大问题。 我第一…...
TCP连接关闭的艺术:从FIN优雅挥手到RST强制终结
1. TCP连接关闭的两种核心机制 想象一下你正在和朋友通电话,结束通话时有礼貌地说"再见"和直接挂断有什么区别?这就是TCP连接关闭的FIN与RST两种方式的本质区别。作为后端工程师,我在处理线上服务连接异常时,发现90%的问…...
