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

news2024/12/26 19:57:35
链接合并两个有序数组
题序号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=3

 p1=0,p2=0, sorteed[6]
 
 第一次while
 while(P1 < 3 || P2 <3)
    if(p1 == 3)/不成立
    else if(p2 == 3) //不成立
    else if(nums1[p1] < nums2[p2]) //1<2,成立
        cur = nums1[P1] /P1=0
        P1++
    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=0
        p2++

    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=1
        P1++
    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.coloradmin.cn/o/2266001.html

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

相关文章

SpringCloudAlibaba技术栈-Nacos

1、什么是Nacos&#xff1f; Nacos是个服务中心&#xff0c;就是你项目每个功能模块都会有个名字&#xff0c;比如支付模块,我们先给这个模块起个名字就叫paymentService,然后将这个名字和这个模块的配置放到Nacos中&#xff0c;其他模块也是这样的。好处是这样能更好地管理项…

Java中使用四叶天动态代理IP构建ip代理池,实现httpClient和Jsoup代理ip爬虫

在本次爬虫项目中&#xff0c;关于应用IP代理池方面&#xff0c;具体完成以下功能&#xff1a; 从指定API地址提取IP到ip池中&#xff08;一次提取的IP数量可以自定义更改&#xff09; 每次开始爬虫前&#xff08;多条爬虫线程并发执行&#xff09;&#xff0c;从ip池中获取一…

MySQL 数据库优化详解【Java数据库调优】

前些天发现了一个巨牛的人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&#xff0c; 忍不住分享一下给大家。点击跳转到网站 学习总结 1、掌握 JAVA入门到进阶知识(持续写作中……&#xff09; 2、学会Oracle数据库入门到入土用法(创作中……&#xff09; 3、手把…

工业大数据分析算法实战-day15

文章目录 day15特定数据类型的算法工业分析中的数据预处理工况划分数据缺失时间数据不连续强噪声大惯性系统趋势项消除 day15 今天是第15天&#xff0c;昨日是针对最优化算法、规则推理算法、系统辨识算法进行了阐述&#xff0c;今日主要是针对其他算法中的特定数据类型的算法…

定时任务——定时任务技术选型

摘要 本文深入探讨了定时任务调度系统的核心问题、技术选型&#xff0c;并对Quartz、Elastic-Job、XXL-Job、Spring Task/ScheduledExecutor、Apache Airflow和Kubernetes CronJob等开源定时任务框架进行了比较分析&#xff0c;包括它们的特点、适用场景和技术栈。文章还讨论了…

前端遇见AI:打造智能应用的新时代

随着技术的发展&#xff0c;AI&#xff08;人工智能&#xff09;不再局限于后端服务器上运行的复杂算法&#xff0c;而是逐渐渗透到前端领域&#xff0c;成为提升用户体验和应用智能水平的关键因素。本文将探讨前端与AI结合的趋势&#xff0c;以及如何利用前端技术实现AI功能&a…

KNN分类算法 HNUST【数据分析技术】(2025)

1.理论知识 KNN&#xff08;K-Nearest Neighbor&#xff09;算法是机器学习算法中最基础、最简单的算法之一。它既能用于分类&#xff0c;也能用于回归。KNN通过测量不同特征值之间的距离来进行分类。 KNN算法的思想&#xff1a; 对于任意n维输入向量&#xff0c;分别对应于特征…

使用 Three.js 创建一个 3D 人形机器人仿真系统

引言 在这篇文章中&#xff0c;我们将探讨如何使用 Three.js 创建一个简单但有趣的 3D 人形机器人仿真系统。这个机器人可以通过键盘控制进行行走和转向&#xff0c;并具有基本的动画效果。 技术栈 HTML5Three.jsJavaScript 实现步骤 1. 基础设置 首先&#xff0c;我们需要…

Android unitTest 单元测试用例编写(初始)

文章目录 了解测试相关库导入依赖库新建测试文件示例执行查看结果网页结果其他 本片讲解的重点是unitTest&#xff0c;而不是androidTest哦 了解测试相关库 androidx.compose.ui:ui-test-junit4: 用于Compose UI的JUnit 4测试库。 它提供了测试Compose UI组件的工具和API。 and…

【蓝桥杯——物联网设计与开发】拓展模块3 - 温度传感器模块

目录 一、温度传感器模块 &#xff08;1&#xff09;资源介绍 &#x1f505;原理图 &#x1f505;STS30-DIS-B &#x1f319;引脚分配 &#x1f319;通信 &#x1f319;时钟拉伸&#xff08;Clock Stretching&#xff09; &#x1f319;单次触发模式 &#x1f319;温度数据转…

如何在任何地方随时使用本地Jupyter Notebook无需公网IP

文章目录 1.前言2.Jupyter Notebook的安装2.1 Jupyter Notebook下载安装2.2 Jupyter Notebook的配置2.3 Cpolar下载安装 3.Cpolar端口设置3.1 Cpolar云端设置3.2.Cpolar本地设置 4.公网访问测试5.结语 1.前言 今天就来给大家安利一套神器组合&#xff1a;通过Windows系统本地部…

长沙景区数据分析项目实现

一、设计题目 长沙景区数据分析项目 二、设计目的 通过本项目让学生独立完成数据统计、数据可视化、数据分析的过程&#xff0c;并提高学生解决问题的能力。 三、设计要求 读取‘长沙景区信息.xlsx’文件&#xff08;读取Excel文件的方法为pandas.read_excel()&#xff0c…

Kafka可视化工具 Offset Explorer (以前叫Kafka Tool)

数据的存储是基于 主题&#xff08;Topic&#xff09; 和 分区&#xff08;Partition&#xff09; 的 Kafka是一个高可靠性的分布式消息系统&#xff0c;广泛应用于大规模数据处理和实时, 为了更方便地管理和监控Kafka集群&#xff0c;开发人员和运维人员经常需要使用可视化工具…

PHP后执行php.exe -v命令报错并给出解决方案

文章目录 一、执行php.exe -v命令报错解决方案 一、执行php.exe -v命令报错 -PHP Warning: ‘C:\windows\SYSTEM32\VCRUNTIME140.dll’ 14.38 is not compatible with this PHP build linked with 14.41 in Unknown on line 0 解决方案 当使用PHP8.4.1时遇到VCRUNTIME140.dll…

详解MySQL在Windows上的安装

目录 查看电脑上是否安装了MySQL 下载安装MySQL 打开MySQL官网&#xff0c;找到DOWNLOADS 然后往下翻&#xff0c;找到MySQL Community(GPL) Downloads>> 然后找到MySQL Community Server 然后下载&#xff0c;选择No thanks,just start my download. 然后双击进行…

Excel粘贴复制不完整的原因以及解决方法

在数据处理和分析的过程中&#xff0c;Excel无疑是不可或缺的工具。然而&#xff0c;在使用Excel进行复制粘贴操作时&#xff0c;有时会遇到粘贴不完整的情况&#xff0c;这可能会让人感到困惑和烦恼。本文将深入探讨Excel粘贴复制不完整的原因、提供解决方案&#xff0c;并给出…

嵌入式轻量级开源操作系统:HeliOS的使用

嵌入式轻量级开源操作系统:HeliOS的使用 &#x1f4cd;项目地址&#xff1a;https://github.com/heliosproj/HeliOS HeliOS项目是一个社区交付的开源项目&#xff0c;用于构建和维护HeliOS嵌入式操作系统&#xff08;OS&#xff09;。HeliOS是一个功能齐全的操作系统&#xff0…

Linux复习3——管理文件系统2

修改文件权限命令 chmod 功能&#xff1a; chmod 命令主要用于修改文件或者目录的权限 只有文件所有者和超级用户可以修改文件或目录的权限 (1)使用数字表示法修改权限 所谓数字表示法是指将读取(r)、写入(w)和执行(x)分别以4、2、1来表示&#xff0c;没有授予的部分就表示…

ECharts散点图-气泡图,附视频讲解与代码下载

引言&#xff1a; ECharts散点图是一种常见的数据可视化图表类型&#xff0c;它通过在二维坐标系或其它坐标系中绘制散乱的点来展示数据之间的关系。本文将详细介绍如何使用ECharts库实现一个散点图&#xff0c;包括图表效果预览、视频讲解及代码下载&#xff0c;让你轻松掌握…

嵌入式驱动开发详解21(网络驱动开发)

文章目录 前言以太网框架ENET 接口简介MAC接口MII \ RMII 接口MDIO 接口RJ45 接口 PHY芯片以太网驱动驱动挂载wifi模块挂载后续 前言 linux驱动主要是字符设备驱动、块设备驱动还有网络设备驱动、字符设备驱动在本专栏前面已经详细将解了&#xff0c;网络设备驱动本文会做简要…