leetcode 面试经典 150 题:合并两个有序数组

链接合并两个有序数组
题序号88
题型数组
解题方法1. 双指针法 ;2. 合并+排序法
难道简单
熟练度✅✅✅✅✅

题目

给你两个按 非递减顺序 排列的整数数组 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 + n
    nums2.length == n
    0 <= m, n <= 200 1 <= m + n <= 200
    -109 <= nums1[i], nums2[j] <= 109

  • 进阶:你可以设计实现一个时间复杂度为 O(m + n) 的算法解决此问题吗?

题解

合并+排序法

  1. 核心要点:可以直接将nums2数组放到nums1数组后面,然后直接重新排序即可以完成非递减排序的新数组。
  2. 时间复杂度:合并O(n);排序(快排)O((m+n)log(m+n))
  3. 空间复杂度:O(log(m+n))
  4. c++ 实现算法
class Solution {
public:void merge(vector<int>& nums1, int m, vector<int>& nums2, int n) {for(int i = 0; i < n; i++){nums1[m+i] = nums2[i];}sort(nums1.begin(), nums1.end());}
};

双指针法

  1. 核心要点:考虑两个数组本身已经排序,可以利用双指针法p1、p2分别指向nums1、nums2数组索引,判定二者大小,小者放入新数组中即可。
  2. 时间复杂度:O(m+n)
  3. 空间复杂度:O(m+n)
  4. c++ 实现算法
class Solution2 {
public:void merge(vector<int>& nums1, int m, vector<int>& nums2, int n){int p1 = 0;int p2 = 0;int sorted[m+n];int cur;while(p1 < m || p2 < n){if(p1 == m){cur = nums2[p2++]; //nums1处理完,则处理nums2}else if(p2 == n){cur = nums1[p1++]; //nums2处理完,则处理nums1}//nums1和nums2都有元素,则比较二者大小else if(nums1[p1] < nums2[p2]){cur = nums1[p1++];}else {cur = nums2[p2++];}sorted[p1+p2-1] = cur;}for(int num = 0; num < m+n; num++){nums1[num] = sorted[num];}}
};
  1. 演示:以示例1为例
 推理:nums1[6] = {1, 2, 3, 0, 0, 0}nums2[3] = {2, 5, 6};m=6-3=3, n=3p1=0,p2=0, sorteed[6]第一次whilewhile(P1 < 3 || P2 <3)if(p1 == 3)/不成立else if(p2 == 3) //不成立else if(nums1[p1] < nums2[p2]) //1<2,成立cur = nums1[P1] /P1=0P1++else //不成立sorted[P1+P2-1] = sorted[1+0-1] = sorted[0] = cur = 1第二次while
while(P1 < 3 || P2 <3)if(p1 == 3)/不成立else if(p2 == 3) //不成立else if(nums1[p1] < nums2[p2]) //2<2,不成立else //成立cur = nums2[p2] //p2=0p2++sorted[P1+P2-1] = sorted[1+1-1] = sorted[1] = cur = 2第三次while
while(P1 < 3 || P2 <3)if(p1 == 3)/不成立else if(p2 == 3) //不成立else if(nums1[p1] < nums2[p2]) //2<5,成立cur = nums1[P1] /P1=1P1++else //不成立sorted[P1+P2-1] = sorted[2+1-1] = sorted[2] = cur = 2
以此类推。。。

完整demo

#include <iostream>
#include <vector>
#include <algorithm>using namespace std;//合并排序法
class Solution {
public:void merge(vector<int>& nums1, int m, vector<int>& nums2, int n) {for(int i = 0; i < n; i++){nums1[m+i] = nums2[i];}sort(nums1.begin(), nums1.end());}
};//双指针法
class Solution2 {
public:void merge(vector<int>& nums1, int m, vector<int>& nums2, int n){int p1 = 0;int p2 = 0;int sorted[m+n];int cur;while(p1 < m || p2 < n){if(p1 == m){cur = nums2[p2++]; //nums1处理完,则处理nums2}else if(p2 == n){cur = nums1[p1++]; //nums2处理完,则处理nums1}//nums1和nums2都有元素,则比较二者大小else if(nums1[p1] < nums2[p2]){cur = nums1[p1++];}else {cur = nums2[p2++];}sorted[p1+p2-1] = cur;}for(int num = 0; num < m+n; num++){nums1[num] = sorted[num];}}
};
int main() {vector<int> nums1 = {1, 2, 3, 0, 0, 0};vector<int> nums2 = {2, 5, 6};int m = nums1.size() - 3;int n = nums2.size();Solution solution2;solution2.merge(nums1, m, nums2, n);cout << "Merged array: " << endl;for(int i = 0; i < nums1.size(); i++) {cout << "nums1[" << i << "]: " << nums1[i] << endl;}cout << endl;return 0;}

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

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

相关文章

ISO/IEC 25010:2023 系统和软件的质量模型(产品质量模型)

本文是对ISO/IEC 25010 2023年底第2版&#xff1a;系统和软件工程-系统和软件质量要求与评估 (SQuaRE)-产品质量模型一文的转载&#xff0c;此外还参考了ISO/IEC 25019:2023(en) Systems and software engineering — Systems and software Quality Requirements and Evaluatio…

【零基础保姆级教程】制作自己的数据集——Labelimg的安装与使用及常见的报错解决方法

1.是什么 LabelImg 是一个图形化的图像标注工具&#xff0c;主要用于机器学习和计算机视觉领域中的数据预处理。它是由 GitHub 用户 tzutalin 开发的开源项目&#xff0c;基于 Python 和 Qt 框架编写。LabelImg 允许用户手动为图像添加边界框&#xff08;bounding boxes&#…

【java基础系列】实现数字的首位交换算法

在java中&#xff0c;手写实现一个数字的首位交换算法实现 实现效果 实现代码 核心业务代码 public static void main(String[] args) {int[] arr {1,2,3,4,5};int temp arr[0];for (int i 0; i < arr.length; i) {System.out.print(arr[i]);}System.out.println(&quo…

【java面向对象编程】第七弹----Object类、类变量与类方法

笔上得来终觉浅,绝知此事要躬行 &#x1f525; 个人主页&#xff1a;星云爱编程 &#x1f525; 所属专栏&#xff1a;javase &#x1f337;追光的人&#xff0c;终会万丈光芒 &#x1f389;欢迎大家点赞&#x1f44d;评论&#x1f4dd;收藏⭐文章 目录 一、Object类 1.1equa…

GO--堆(have TODO)

堆 堆&#xff08;Heap&#xff09;是一种特殊的数据结构。它是一棵完全二叉树&#xff08;完全二叉树是指除了最后一层外&#xff0c;每一层上的节点数都是满的&#xff0c;并且最后一层的节点都集中在左边&#xff09;&#xff0c;结放在数组&#xff08;切片&#xff09;中…

java开发入门学习五-流程控制

流程控制语句 if&#xff0c; if...else&#xff0c; if..else if..else 与前端相同 略 switch case 与前端不同的是case不能使用表达式&#xff0c;使用表达式会报错 class TestSwitch {public static void main(String[] args) {// switch 表达式只能是特定的数据类型…

豆包MarsCode测评:编程效率再提升

豆包MarsCode测评&#xff1a;编程效率再提升 本文正在参与豆包MarsCode AI 编程体验家活动 随着人工智能技术的发展&#xff0c;编程的方式也在悄然发生变化。最近&#xff0c;豆包推出的 AI 编程工具 MarsCode 在开发者社区引发了不小的关注。这是一款支持多种主流编程语言…

FFmpeg 框架简介和文件解复用

文章目录 ffmpeg框架简介libavformat库libavcodec库libavdevice库 复用&#xff08;muxers&#xff09;和解复用&#xff08;demuxers&#xff09;容器格式FLVScript Tag Data结构&#xff08;脚本类型、帧类型&#xff09;Audio Tag Data结构&#xff08;音频Tag&#xff09;V…

Unity开发哪里下载安卓Android-NDK-r21d,外加Android Studio打包实验

NDK下载方法&#xff08;是r21d,不是r21e, 不是abc, 是d版本呢) google的东西&#xff0c;居然是完全开源的 真的不是很多公司能做到&#xff0c;和那种伪搜索引擎是不同的 到底什么时候google才会开始造车 不过风险很多&#xff0c;最好不要合资&#xff0c;风险更大 Andr…

leetcode-128.最长连续序列-day14

为什么我感觉上述代码时间复杂度接近O(2n), 虽然有while循环&#xff0c;但是前面有个if判断&#xff0c;能进入while循环的也不多&#xff0c;while循环就相当于两个for循环&#xff0c;但不是嵌套类型的&#xff1a; 变量作用域问题&#xff1a;

人工智能入门是先看西瓜书还是先看花书?

在人工智能入门时&#xff0c;关于先看《机器学习》&#xff08;西瓜书&#xff09;还是先看《深度学习》&#xff08;花书&#xff09;的问题&#xff0c;实际上取决于个人的学习目标和背景。 《机器学习》&#xff08;西瓜书&#xff09;由周志华教授撰写&#xff0c;是一本…

B 站数据库负责人赵月顺:助力海内外业务增长,百套 TiDB 的选型与运维实战

导读 B 站对 TiDB 的应用已相当广泛&#xff0c;被应用在了 包括视频观看、一键三连、发送弹幕、撰写评论、阅读漫画以及视频后端的存储等场景&#xff0c; 目前拥有近 100 套集群。 本文由 B 站数据库负责人赵月顺撰写&#xff0c; 详细介绍了 B 站面临业务增长选择 TiDB 的…

二九(vue2-05)、父子通信v-model、sync、ref、¥nextTick、自定义指令、具名插槽、作用域插槽、综合案例 - 商品列表

1. 进阶语法 1.1 v-model 简化代码 App.vue <template><!-- 11-src-下拉封装 --><div class"app"><!-- <BaseSelect :cityId"selectId" changeId"handleChangeId"></BaseSelect> --><!-- v-model 简化…

flask-admin+Flask-WTF 实现实现增删改查

背景&#xff1a; flask-adminflask-wtf在网上可以搜索到很多资料&#xff0c;但有价值的很少&#xff0c;或许是太简单&#xff0c;或者是很少人这么用&#xff0c;或者。。。&#xff0c;本文将作者近礼拜摸索到的一点经验分享出来&#xff0c;给自己做个记录。 材料&#…

Linux下基于最新稳定版ESP-IDF5.3.2开发esp32s3入门任务间的通讯-消息队列【入门四】

继续上一篇任务创建 【Linux下基于最新稳定版ESP-IDF5.3.2开发esp32s3入门任务间的通讯-信号量【入门三】-CSDN博客】 今天要实现消息队列进行任务的通讯 一、从上一篇信号量通讯demo拷贝一份重命名&#xff0c;还是之前的两个任务&#xff0c;重命名了。 xTaskCreatePinned…

workman服务端开发模式-应用开发-后端api推送修改二

需要修改两个地方&#xff0c;第一个是总控制里面的续token延时&#xff0c;第二个是操作日志记录 一、总控续token延时方法 在根目录下app文件夹下controller文件夹下Base.php中修改isLoginAuth方法&#xff0c;具体代码如下&#xff1a; <?php /*** 总控制* User: 龙哥…

ReactPress 1.6.0:重塑博客体验,引领内容创新

ReactPress 是一个基于Next.js的博客&CMS系统&#xff0c; Github项目地址&#xff1a;https://github.com/fecommunity/reactpress 欢迎Star。 体验地址&#xff1a;http://blog.gaoredu.com/ 今天&#xff0c;我们自豪地宣布ReactPress 1.6.0版本的正式发布&#xff0c;…

重拾设计模式--外观模式

文章目录 外观模式&#xff08;Facade Pattern&#xff09;概述定义 外观模式UML图作用 外观模式的结构C 代码示例1C代码示例2总结 外观模式&#xff08;Facade Pattern&#xff09;概述 定义 外观模式是一种结构型设计模式&#xff0c;它为子系统中的一组接口提供了一个统一…

接口测试Day03-postman断言关联

postman常用断言 注意&#xff1a;不需要手敲&#xff0c;点击自动生成 断言响应状态码 Status code&#xff1a;Code is 200 //断言响应状态码为 200 pm.test("Status code is 200", function () {pm.response.to.have.status(200); });pm: postman的实例 test() …

提升专业素养的实用指南

在当今竞争激烈的职场&#xff0c;仅仅拥有专业技能已经不足以立于不败之地。持续提升自身专业素养&#xff0c;才是保持竞争力、实现职业目标的关键。那么&#xff0c;如何才能有效地提升专业素养&#xff0c;在职业道路上走得更稳、更远呢&#xff1f;以下是一些实用性建议&a…