力扣面试经典150题——合并两个有序数组

news2024/11/20 23:17:58

目录

题目链接:

题目描述

示例

提示:

解法一:合并数组+排序

Java写法:

运行时间

C++写法:

运行时间

时间复杂度和空间复杂度

 解法二:双指针

Java写法:

运行时间

C++写法:

运行时间

时间复杂度和空间复杂度

解法三:逆向双指针

Java写法:

运行时间

C++写法:

运行时间

时间复杂度和空间复杂度

总结


题目链接:

注:下述题目描述和示例均来自力扣

题目描述

        给你两个按 非递减顺序 排列的整数数组 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
  • -10^9 <= nums1[i], nums2[j] <= 10^9

解法一:合并数组+排序

        先将数组 nums2​ 放进数组 nums1​ 的尾部,然后直接对整个数组进行排序。这太简单了,没啥好说的了。

Java写法:

class Solution {
    public void merge(int[] nums1, int m, int[] nums2, int n) {
        for(int i = 0; n != i; i++){
            nums1[i + m] = nums2[i];
        }
        Arrays.sort(nums1);
    }
}

运行时间

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. 初始化
    • 创建一个新的整型数组res,其大小等于nums1nums2的长度之和(m + n)。
    • 初始化三个指针p1p2p,分别用于遍历nums1nums2res
  2. 合并数组
    • 使用一个while循环来比较nums1nums2当前指针所指向的元素。
    • 如果nums1[p1]小于或等于nums2[p2],则将nums1[p1]添加到res[p]中,并将p1p递增。
    • 否则,将nums2[p2]添加到res[p]中,并将p2p递增。
    • 重复这个过程,直到任一数组的所有元素都被添加到res中。
  3. 处理剩余元素
    • 如果nums1还有剩余元素(即p1 < m),则使用一个额外的for循环将这些元素添加到res的末尾。
    • 注意:虽然在这个特定的问题中,由于nums1nums2是交替添加到res中的,所以实际上在第一个while循环结束后,nums2的剩余元素(如果有的话)会被自动添加到res的末尾,而不需要再检查nums2是否还有剩余元素。但是,为了代码的清晰和对称性,优化之前的代码可能还是包含了检查nums2剩余元素的逻辑(尽管这部分是多余的)。
  4. 复制结果回nums1
    • 使用另一个for循环将res数组的内容复制回nums1

Java写法:

class Solution {
    public void merge(int[] nums1, int m, int[] nums2, int n) {
        int[] res = new int[m + n];
        int p1 = 0;
        int p2 = 0;
        int p = 0;
        while(p1 < m && p2 < n){
            if(nums1[p1] <= nums2[p2]){
                res[p] = nums1[p1];
                p1++;
            }else{
                res[p] = nums2[p2];
                p2++;
            }
            p++;
        }

        if(p1 != m){
            for(int i = p1; p1 < m; p1++,p++){
                res[p] = nums1[p1];
            }
        }
        if(p2 != n){
            for(int i = p2; p2 < n; p2++,p++){
                res[p] = nums2[p2];
            }
        }

        for (int i = 0; i != m + n; i++) {
            nums1[i] = res[i];
        }
    }
}

运行时间

C++写法:

class Solution {
public:
    void merge(vector<int>& nums1, int m, vector<int>& nums2, int n) {
        std::vector<int> res(m + n);  
        int p1 = 0, p2 = 0, p = 0;  
  
        // 合并两个数组到res中  
        while (p1 < m && p2 < n) {  
            if (nums1[p1] <= nums2[p2]) {  
                res[p++] = nums1[p1++];  
            } else {  
                res[p++] = nums2[p2++];  
            }  
        }  
  
        // 如果nums1还有剩余元素,将它们复制到res中  
        while (p1 < m) {  
            res[p++] = nums1[p1++];  
        }  
  
        // 如果nums2还有剩余元素(实际上这个循环在上面的while循环后不会执行,因为p1和p2是互斥的)  
        // 但为了保持与Java代码的对称性,我还是写了出来  
        while (p2 < n) {  
            res[p++] = nums2[p2++];  
        }  
  
        // 将合并后的结果复制回nums1  
        for (int i = 0; i < m + n; i++) {  
            nums1[i] = res[i];  
        }  
    }  
};

运行时间

时间复杂度和空间复杂度

 

 




解法三:逆向双指针

Java写法:

class Solution {
    public void merge(int[] nums1, int m, int[] nums2, int n) {
        // 1 2 3 0 0 0 
        //     p1 p
        // 2 5 6
        //     p2
        int p1 = m - 1;
        int p2 = n - 1;
        int p = m + n - 1;
        while(p1 >= 0 && p2 >= 0){
            if(nums1[p1] >= nums2[p2]){
                nums1[p] = nums1[p1];
                p1--;
            }else{
                nums1[p] = nums2[p2];
                p2--;
            }
            p--;
        }

        if(p1 >= 0){
            for(int i = p1; p1 >= 0; p1--,p--){
                System.out.println(Arrays.toString(nums1));
                nums1[p] = nums1[p1];
            }
        }
        if(p2 >= 0){
            for(int i = p2; p2 >= 0; p2--,p--){
                nums1[p] = nums2[p2];
            }
        }

    }
}

运行时间

C++写法:

class Solution {
public:
    void merge(vector<int>& nums1, int m, vector<int>& nums2, int n) {
        int p1 = m - 1;  
        int p2 = n - 1;  
        int p = m + n - 1;  
  
        while (p1 >= 0 && p2 >= 0) {  
            if (nums1[p1] >= nums2[p2]) {  
                nums1[p] = nums1[p1];  
                p1--;  
            } else {  
                nums1[p] = nums2[p2];  
                p2--;  
            }  
            p--;  
        }  
  
        // 如果nums2中还有剩余元素,将它们复制到nums1的末尾  
        while (p2 >= 0) {  
            nums1[p] = nums2[p2];  
            p2--;  
            p--;  
        }  
    }  
}; 

运行时间

时间复杂度和空间复杂度


总结

        哈哈哈哈哈哈哈哈,哈哈哈哈哈哈,确实简单,兄弟们,太EZ了

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

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

相关文章

新闻文本分类识别系统Python+卷积神经网络算法+人工智能+深度学习+计算机毕设项目+TensorFlow+Django网页界面

一、介绍 文本分类识别系统。本系统使用Python作为主要开发语言&#xff0c;首先收集了10种中文文本数据集&#xff08;“体育类”, “财经类”, “房产类”, “家居类”, “教育类”, “科技类”, “时尚类”, “时政类”, “游戏类”, “娱乐类”&#xff09;&#xff0c;然…

024.PL-SQL进阶—游标

课 程 推 荐我 的 个 人 主 页&#xff1a;&#x1f449;&#x1f449; 失心疯的个人主页 &#x1f448;&#x1f448;入 门 教 程 推 荐 &#xff1a;&#x1f449;&#x1f449; Python零基础入门教程合集 &#x1f448;&#x1f448;虚 拟 环 境 搭 建 &#xff1a;&#x1…

STM32 Modbus主从站实例程序-FreeRTOS

资料下载地址&#xff1a;STM32 Modbus主从站实例程序-FreeRTOS​​​​​​​ 基本设置 启用Freertos,添加任务 设置中断优先级 设置长生成MDK工程 工程里面添加Modbus库 修改main.c 修改freertos.c 编译下载到单片机,完美运行

黄奕前夫勇夺“全球金融圈奥斯卡”!与她离婚后,姜凯身价涨30倍

黄奕前夫勇夺“全球金融圈奥斯卡”&#xff01;与她离婚后&#xff0c;姜凯身价涨30倍 近日&#xff0c;小编被一则经济类新闻吸引。姜凯主理的凯资本Kai Capital荣获“2024年度全球最佳多策略对冲基金”。 这不是演员黄奕的第一任丈夫姜凯吗&#xff1f; 这个奖项可不一般。…

Ubuntu LLaMA-Factory实战

一、Ubuntu LLaMA-Factory实战安装&#xff1a; CUDA 安装 CUDA 是由 NVIDIA 创建的一个并行计算平台和编程模型&#xff0c;它让开发者可以使用 NVIDIA 的 GPU 进行高性能的并行计算。 首先&#xff0c;在 https://developer.nvidia.com/cuda-gpus 查看您的 GPU 是否支持CU…

html TAB切换按钮变色、自动生成table--使用函数优化结构

<!DOCTYPE html> <head> <meta charset"UTF-8"> <title>Dynamic Tabs with Table Data</title> <style> /* 简单的样式 */ .tab-content { display: none; border: 1px solid #ccc; padding: 1px; marg…

【专题】2024年中国白酒行业数字化转型研究报告合集PDF分享(附原数据表)

原文链接&#xff1a;https://tecdat.cn/?p37755 消费人群趋于年轻化&#xff0c;消费需求迈向健康化&#xff0c;消费场景与渠道走向多元化&#xff0c;这些因素共同驱动企业凭借数据能力来适应市场的变化。从消费市场来看&#xff0c;消费群体、需求、场景及渠道皆展现出与…

怎么制作线上报名表_解锁报名新体验

在这个数字化飞速发展的时代&#xff0c;每一次活动的举办都力求高效、便捷与个性化。线上报名表&#xff0c;作为连接主办方与参与者的桥梁&#xff0c;其重要性不言而喻。它不仅是信息收集的工具&#xff0c;更是品牌形象的展示窗口&#xff0c;能够直接影响参与者对活动的第…

用最新的C++技术,如何实现一个序列化工具库?

在现代C的发展中&#xff0c;新引入的语言特性为高效且易用的序列化和反序列化库的开发提供了强大的支持。我们今天一起来探索如何在现代C特性下写出更简洁、更易维护的序列化工具代码。 现有序列化库的挑战 传统的C序列化库&#xff0c;如Boost.Serialization和Cereal&#…

神经网络(四):UNet语义分割网络

文章目录 一、简介二、网络结构2.1编码器部分2.2解码器部分2.3完整代码 三、实战案例 一、简介 UNet网络是一种用于图像分割的卷积神经网络&#xff0c;其特点是采用了U型网络结构&#xff0c;因此称为UNet。该网络具有编码器和解码器结构&#xff0c;两种结构的功能如下&#…

Redis的数据类型常用命令

目录 前言 String字符串 常见命令 set get mget mset setnx incr incrby decr decyby append Hash哈希 常见命令 hset hget hexists hdel hkeys hvals hgetall hmget hlen hsetnx List 列表 常见命令 lpush lrange lpushx rpush rpushhx lpop…

postman下载安装和导入导出脚本一键执行

下载和安装 首先&#xff0c;下载并安装PostMan&#xff0c;请访问PostMan的官方下载网址&#xff1a;https://www.getpostman.com/downloads/ 下载所需的安装程序后&#xff0c;直接安装即可 第一次打开会要求登录账号密码&#xff0c;如果没有&#xff0c;直接关闭&#xf…

海报制作哪个软件好?建议试试这5个

2024年过得飞快&#xff0c;转眼间国庆佳节即将到来。 在这个举国欢庆的时刻&#xff0c;无论是商家还是个人&#xff0c;都希望通过海报来传递节日的喜悦和祝福。制作一张吸引人的海报&#xff0c;不仅能提升品牌形象&#xff0c;还能增强节日氛围。 那么&#xff0c;如何快…

【Python报错已解决】TypeError: can only concatenate str (not “int“) to str

&#x1f3ac; 鸽芷咕&#xff1a;个人主页 &#x1f525; 个人专栏: 《C干货基地》《粉丝福利》 ⛺️生活的理想&#xff0c;就是为了理想的生活! 专栏介绍 在软件开发和日常使用中&#xff0c;BUG是不可避免的。本专栏致力于为广大开发者和技术爱好者提供一个关于BUG解决的经…

【Java 问题】基础——Java 概述

Java 概述 1. 什么是 Java ?2. Java 语言有哪些特点3. JVM、JDK 和 JRE 有什么区别&#xff1f;4. 说说什么是跨平台性&#xff1f;原理是什么&#xff1f;5. 什么是字节码&#xff1f;采用字节码的好处是什么&#xff1f;6. 为什么说 Java 语言 "编译与解释并存"?…

汽车行业SAP全球模版导入方案【集团出海部署】

在汽车行业实施SAP系统是一个复杂且具挑战性的项目&#xff0c;涉及多个业务模块和跨部门协作。以下是一个汽车行业SAP实施的导入方案&#xff0c;包括关键步骤、模块选择、最佳实践和注意事项。 1. 项目启动及规划 项目启动 项目发起&#xff1a;确定项目范围、目标和业务需…

Spring源码-ConfigurationClassPostProcessor类解析spring相关注解

ConfigurationClassPostProcessor类的作用 此类是一个后置处理器的类&#xff0c;主要功能是参与BeanFactory的建造&#xff0c;主要功能如下 1、解析加了Configuration的配置类 2、解析ComponentScan扫描的包 3、解析ComponentScans扫描的包 4、解析Import注解 该类在springbo…

【原创教程】如何用西门子1500读写巴鲁夫RFID

实现的功能及应用的场合 通过使用RFID进行对托盘信息工件信息的追踪记忆&#xff0c;方便了解工件的状态内容。适用于流水线等场合。 硬件配置 巴鲁夫RFID 巴鲁夫RFID一套包含&#xff1a;RFID分析单元&#xff0c;RFID数据读写头&#xff0c;RFID数据载体。 ①RFID分析单…

ai写论文哪个平台好?分享4款ai论文写作平台软件

在当前的学术研究和论文写作领域&#xff0c;AI技术的应用已经成为一种趋势。通过智能算法和大数据分析&#xff0c;AI工具能够帮助学者和学生提高写作效率、优化内容结构&#xff0c;并确保论文的原创性和质量。以下是四款备受推荐的AI论文写作平台软件&#xff1a; 1. 千笔-…

Js基础

JS编写位置 将代码编写在html网页script标签 <script>// 弹出alert("test")// 控制台输出日志console.log("hello world")// 向网页输入内容&#xff0c;即往body中写内容document.write("write content")</script> 将代码编写在外部…