【LeetCode】88. 合并两个有序数组
88. 合并两个有序数组
难度:简单
题目
给你两个按 非递减顺序 排列的整数数组 nums1 和 nums2,另有两个整数 m 和 n ,分别表示 nums1 和 nums2 中的元素数目。
请你 合并 nums2 到 nums1 中,使合并后的数组同样按 非递减顺序 排列。
**注意:**最终,合并后数组不应由函数返回,而是存储在数组 nums1 中。为了应对这种情况,nums1 的初始长度为 m + n,其中前 m 个元素表示应合并的元素,后 n 个元素为 0 ,应忽略。nums2 的长度为 n 。
示例 1:
输入: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 中的元素。
示例 2:
输入:nums1 = [1], m = 1, nums2 = [], n = 0
输出:[1]
解释:需要合并 [1] 和 [] 。
合并结果是 [1] 。
示例 3:
输入:nums1 = [0], m = 0, nums2 = [1], n = 1
输出:[1]
解释:需要合并的数组是 [] 和 [1] 。
合并结果是 [1] 。
注意,因为 m = 0 ,所以 nums1 中没有元素。nums1 中仅存的 0 仅仅是为了确保合并结果可以顺利存放到 nums1 中。
提示:
nums1.length == m + nnums2.length == n0 <= m, n <= 2001 <= m + n <= 200-10^9 <= nums1[i], nums2[j] <= 10^9
**进阶:**你可以设计实现一个时间复杂度为 O(m + n) 的算法解决此问题吗?
个人题解
思路:
- 定义两个指针分别指向 nums1,一个指向 nums2 有效位的最后一位,再定义指针 cur 指向nums1 的最后一位
- 逐个比较将较大的放在 cur 的位置,cur 往左移,较大位放完后也左移
- 考虑边界
- 如果 p1 已经遍历完了 nums1,则需要将 p2 左侧位置的数都移到 nums1 位置上去
- 如果 p2 已经遍历完了 nums2,则剩下的本来就在 nums1 相应位置,无需移动,跳出循环即可
class Solution {public void merge(int[] nums1, int m, int[] nums2, int n) {int p1 = m - 1;int p2 = n - 1;int cur = nums1.length - 1;while (cur > -1) {if (p1 > -1 && p2 > -1) {nums1[cur--] = nums1[p1] >= nums2[p2] ? nums1[p1--] : nums2[p2--];} else if (p2 > -1) {while (p2 > -1) {nums1[cur--] = nums2[p2--];}} else {break;}}}
}
官方题解
方法一:直接合并后排序
最直观的方法是先将数组 nums2 放进 nums1 的尾部,然后直接对整个数组进行排序。
class Solution {public void merge(int[] nums1, int m, int[] nums2, int n) {for (int i = 0; i != n; ++i) {nums1[m + i] = nums2[i];}Arrays.sort(nums1);}
}
方法二:双指针
方法一没有利用数组 nums1 与 nums2 已经被排序的性质。为了利用这一性质,我们可以使用双指针方法。这一方法将两个数组看作队列,每次从两个数组头部取出比较小的数字放到结果中。
我们为两个数组分别设置一个指针 p1 与 p2 来作为队列的头部指针。代码实现如下:
class Solution {public void merge(int[] nums1, int m, int[] nums2, int n) {int p1 = 0, p2 = 0;int[] sorted = new int[m + n];int cur;while (p1 < m || p2 < n) {if (p1 == m) {cur = nums2[p2++];} else if (p2 == n) {cur = nums1[p1++];} else if (nums1[p1] < nums2[p2]) {cur = nums1[p1++];} else {cur = nums2[p2++];}sorted[p1 + p2 - 1] = cur;}for (int i = 0; i != m + n; ++i) {nums1[i] = sorted[i];}}
}
方法三:逆向双指针
观察可知,nums1 的后半部分是空的,可以直接覆盖而不会影响结果。因此可以指针设置为从后向前遍历,每次取两者之中的较大者放进 nums1 的后面
class Solution {public void merge(int[] nums1, int m, int[] nums2, int n) {int p1 = m - 1, p2 = n - 1;int tail = m + n - 1;int cur;while (p1 >= 0 || p2 >= 0) {if (p1 == -1) {cur = nums2[p2--];} else if (p2 == -1) {cur = nums1[p1--];} else if (nums1[p1] > nums2[p2]) {cur = nums1[p1--];} else {cur = nums2[p2--];}nums1[tail--] = cur;}}
}
作者:力扣官方题解
链接:https://leetcode.cn/problems/merge-sorted-array/solutions/666608/he-bing-liang-ge-you-xu-shu-zu-by-leetco-rrb0/
来源:力扣(LeetCode)
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
相关文章:
【LeetCode】88. 合并两个有序数组
88. 合并两个有序数组 难度:简单 题目 给你两个按 非递减顺序 排列的整数数组 nums1 和 nums2,另有两个整数 m 和 n ,分别表示 nums1 和 nums2 中的元素数目。 请你 合并 nums2 到 nums1 中,使合并后的数组同样按 非递减顺序 …...
Linux文件权限
R 代表可读 W 代表可写 X 代表可执行 文档类型有如下表示方法: d - 目录,例如上表档名为『.gconf』的那一行; - - 文档,例如上表档名为『install.log』那一行; l - 链接档(link file); b …...
〖大前端 - 基础入门三大核心之JS篇㉟〗- JavaScript 的DOM简介
说明:该文属于 大前端全栈架构白宝书专栏,目前阶段免费,如需要项目实战或者是体系化资源,文末名片加V!作者:不渴望力量的哈士奇(哈哥),十余年工作经验, 从事过全栈研发、产品经理等工作…...
CentOS中安装常用环境
一、CentOS安装 redis ①:更新yum sudo yum update②:安装 EPEL 存储库 Redis 通常位于 EPEL 存储库中。运行以下命令安装 EPEL 存储库 sudo yum install epel-release③:安装 Redis sudo yum install redis④:启动 Redis 服…...
python时间变化与字符串替换技术及读JSON文件等实践笔记
1. 需求描述 根据预测出结果发出指令的秒级时间,使用时间戳,也就是设定时间(字符串)转为数字时间戳。时间计算转换过程中,出现单个整数(例如8点),按字符串格式补齐两位“08”。字符…...
leetcode刷题日记:141. Linked List Cycle(环形链表)
这一题是给我们一个链表让我们判断这是否是一个环形链表,我们知道如果一个链表中有环的话这一个链表是没有办法访问到尾的, 假若有如图所示的带环链表: 我们从图示中很容易看出来这一个链表在访问的时候会在里面转圈,我们再来看看…...
html书本翻页效果,浪漫表白日记本(附源码)
文章目录 1.设计来源1.1 书本正面1.2 界面1-21.3 界面3-41.4 界面5-61.5 界面7-81.6 界面9-101.7 界面11-121.8 书本结尾 2.效果和源码2.1 动态效果2.2 源代码 源码下载 作者:xcLeigh 文章地址:https://blog.csdn.net/weixin_43151418/article/details/1…...
【Mysql】学习笔记
目录 基本操作登录指令:启动、关闭、重启mysql指令(适用于centos7):查看mysql运行状态:删除和创建表 修改密码(ubuntu18.04可行,其余版本行不行不知道)3 使用MYSQL了解数据库和表 4 …...
工作记录-------java文件的JVM之旅(学习篇)---好理解
一个java文件,如何实现功能呢?需要去JVM这个地方。 java文件高高兴兴的来到JVM,想要开始JVM之旅,它确说:“现在的我还不能进去,需要做一次转换,生成class文件才行”。为什么这样呢?…...
城市内涝对策,万宾科技内涝积水监测仪使用效果
随着城市化进程的加速,城市道路积水问题明显越来越多,给人们的出行和生活带来更多的不便。内涝积水监测仪作为高科技产品能够实时监测道路积水情况,为城市排水系统的管理和维护提供重要的帮助。 在城市生命线的基础设施规划之中,地…...
android的通知使用
在 Android 中,通知(Notification)是一种在状态栏显示消息的方式,通常用于向用户展示应用程序的重要信息、事件或更新。以下是一个简单的示例,演示如何在 Android 应用程序中使用通知: import android.app…...
001 opencv addWeighted
目录 一、环境 二、addWeighted函数 三、代码演示 一、环境 本文使用环境为: Windows10Python 3.9.17opencv-python 4.8.0.74 二、addWeighted函数 OpenCV中的cv.addWeighted函数是一个用于图像叠加的函数,它可以将两个具有相同尺寸和类型的图像按…...
2311rust,到35版本更新
1.32.0 rustup self update rustup update stablerustup更新自己. dbg宏 打印调试,你需要: let x 5; println!("{:?}", x); //甚至可能是 println!("{:#?}", x);在Rust1.32.0中,为此添加了个新的dbg!宏: fn main() {let x 5;dbg!(x); }如果运行此…...
UniPro提高集成能力 让客户专注于交付价值
一千个哈姆莱特就有一千个读者,一千个开发团队,也会有各不相同的软件工具和工作流程。工具与工具之间,功能上的割裂亦或重叠,都会给企业和团队的协作带来阻塞,结果就会导致团队之间各自为战、信息孤岛的形成以及资源的…...
Python---函数的作用,定义,使用步骤(调用步骤)
Python实际开发中,使用函数的目的只有一个 “让我们的代码可以被重复使用” 函数的作用有两个: ① 模块化编程 ② 代码重用 在编程领域,编程可以分为两大类:① 模块化编程 ② 面向对象编程 函数就是一个 被命名的、独立的…...
ERP智能管理系统:智能化的未来之路
ERP智能管理系统:智能化的未来之路 科技飞速发展,人工智能(AI)和大数据等先进技术的应用正在改变着企业的运营模式。其中,ERP智能管理系统在帮助企业实现智能化运营、提高效率、降低成本等方面发挥着越来越重要的作用。本文将为您详细介绍ERP…...
c++ memccpy和 = 都可以用于赋值操作
memccpy和都可以用于赋值操作,但它们的作用和使用方式有所不同。 是C中的赋值运算符,可以用于基本类型、对象、结构体等的赋值操作。对于结构体,它会执行成员到成员的赋值,也就是浅拷贝。如果结构体中有指针成员,赋值只…...
Golang for 循环中的隐式内存别名问题
Golang for 循环中的隐式内存别名问题 隐式内存别名是指在循环迭代过程中对同一变量的多次引用可能导致不可预期的结果。这主要涉及到 goroutine 和闭包的使用场景,在并发编程中容易引起 bug。 例如,下面的示例代码中存在隐式内存别名问题:…...
2023年亚太杯数学建模思路 - 复盘:光照强度计算的优化模型
文章目录 0 赛题思路1 问题要求2 假设约定3 符号约定4 建立模型5 模型求解6 实现代码 建模资料 0 赛题思路 (赛题出来以后第一时间在CSDN分享) https://blog.csdn.net/dc_sinor?typeblog 1 问题要求 现在已知一个教室长为15米,宽为12米&…...
Unity——利用Mesh绘制图形
什么是Mesh? Mesh 是用于表示和存储3D模型几何信息的类。它包含了顶点坐标、法线、UV坐标和其他与几何形状相关的数据,同时也包含了定义了这些数据如何连接以形成三角形的索引。 通过Mesh类,你可以创建、修改和渲染3D模型。一些常见的操作包括…...
基于Ascend 950的Cube编程
直播回放链接:基于下一代硬件的Cube编程_哔哩哔哩_bilibili...
保姆级教程:在Windows上用Python 3.10.7一键部署SenseVoice语音识别API
Windows平台Python 3.10.7环境下的SenseVoice语音识别API全流程部署指南 语音识别技术正在改变我们与设备交互的方式。对于开发者而言,快速搭建一个可靠的语音识别服务是许多AI应用开发的第一步。SenseVoice作为开源的语音识别解决方案,以其轻量级和易用…...
从POC到EXP:深入拆解CVE-2025-0282利用链中的三大‘拦路虎’(NX/PIE、虚函数、内存释放)与绕过思路
从POC到EXP:深入拆解CVE-2025-0282利用链中的三大‘拦路虎’(NX/PIE、虚函数、内存释放)与绕过思路 现代漏洞利用已演变为攻防双方在二进制层面的精密博弈。当安全研究员发现一个栈溢出漏洞时,真正的挑战往往始于漏洞验证之后——…...
iperf3网络性能测试工具完全指南:从安装到企业级应用
iperf3网络性能测试工具完全指南:从安装到企业级应用 【免费下载链接】iperf3-win-builds iperf3 binaries for Windows. Benchmark your network limits. 项目地址: https://gitcode.com/gh_mirrors/ip/iperf3-win-builds 在当今数字化时代,网络…...
终极指南:如何为Muzei Live Wallpaper配置GitHub Actions自动化构建与测试
终极指南:如何为Muzei Live Wallpaper配置GitHub Actions自动化构建与测试 【免费下载链接】muzei Muzei Live Wallpaper for Android 项目地址: https://gitcode.com/gh_mirrors/mu/muzei Muzei Live Wallpaper是一款备受欢迎的Android动态壁纸应用…...
LeetCode 111. Minimum Depth of Binary Tree 题解
LeetCode 111. Minimum Depth of Binary Tree 题解 题目描述 给定一个二叉树,找出其最小深度。 最小深度是从根节点到最近叶子节点的最短路径上的节点数量。 叶子节点 是指没有子节点的节点。 示例 1: 输入:root [3,9,20,null,null,15,7] 输…...
CMake构建类型避坑指南:为什么你的Release模式没有优化?CMAKE_BUILD_TYPE常见问题排查
CMake构建类型避坑指南:为什么你的Release模式没有优化? 在C项目开发中,构建类型的选择直接影响最终生成的可执行文件性能。许多开发者在使用CMake时都遇到过这样的困惑:明明设置了CMAKE_BUILD_TYPERelease,但生成的代…...
终极指南:Laravel DataTables 性能优化实战——不同场景下的表现对比
终极指南:Laravel DataTables 性能优化实战——不同场景下的表现对比 【免费下载链接】laravel-datatables jQuery DataTables API for Laravel 4|5|6|7|8|9|10 项目地址: https://gitcode.com/gh_mirrors/la/laravel-datatables Laravel DataTables 是一款强…...
Phi-4-mini-reasoning快速上手:3步完成vLLM服务部署+Chainlit前端验证
Phi-4-mini-reasoning快速上手:3步完成vLLM服务部署Chainlit前端验证 1. 模型简介 Phi-4-mini-reasoning 是一个基于合成数据构建的轻量级开源模型,专注于高质量、密集推理的数据处理能力。作为Phi-4模型家族的一员,它经过专门微调以提升数…...
QwQ-32B+ollama实战案例:气象模型参数推理与极端天气归因分析
QwQ-32Bollama实战案例:气象模型参数推理与极端天气归因分析 1. 引言:当AI遇到气象科学 最近几年,极端天气事件越来越频繁,从罕见高温到突发暴雨,都给我们的生活带来了不小的影响。作为气象研究人员,我们…...
