当前位置: 首页 > news >正文

【LeetCode_88】合并两个有序数组

刷爆LeetCode系列

  • LeetCode第88题:合并两个有序数组
  • github地址
  • 前言
  • 题目描述
  • 题目与思路分析
  • 代码实现
  • 算法代码优化

LeetCode第88题:合并两个有序数组

github地址

有梦想的电信狗

前言

本文使用C++实现LeetCode第88题


题目描述

题目链接:https://leetcode.cn/problems/merge-sorted-array/description/

在这里插入图片描述
在这里插入图片描述


题目与思路分析

目标分析

  1. 将两个非递减数组nums1nums2中的数据合并nums1
  2. 合并后的数组保持非递减顺序
  3. 不复制数组,即原地合并,意味着时间复杂度为O(n),空间复杂度为O(1)
  4. 直接对原数组进行操作,直接合并到nums1

思路:双指针:两个指针从后往前操作,依次比较两个数组中末尾元素的大小将较大者放在nums1的末尾。比较结束后再进行剩余元素的处理

  • end1:指向nums1中最后一个有效元素的位置,初始下标为 m - 1
  • end2:指向nums2中最后一个有效元素的位置,初始下标为 n - 1
  • dst:指向较大元素应该被放入的位置,初始下标为 nums1.size() - 1

操作

  • 循环比较移动数据,end1和end2只要有一个下标结束循环就结束,循环继续的条件为end1 >= 0 && end2 >= 0
  • 比较元素:
    • nums1[end1] >= nums2[end2]时:将较大元素nums1[end1]放在nums1[dst],同时dstend1减减

    • nums1[end1] < nums2[end2]时:将较大元素nums2[end2]放在nums1[dst],同时dstend2减减

  • 循环结束后,只可能有两种情况:
    • end2先结束:此时nums1中的数据直接就为有序的,无需任何操作

    • end1先结束:说明此时nums2还有数据未合并nums1中,需要手动合并

在这里插入图片描述

在这里插入图片描述

代码实现

class Solution {
public:void merge(vector<int>& nums1, int m, vector<int>& nums2, int n) {int end1 = m - 1, end2 = n - 1;int dst = nums1.size() - 1;// 只要有一个结束就结束while(end1 >= 0 && end2 >= 0){if(nums1[end1] >= nums2[end2]){nums1[dst] = nums1[end1];dst--;end1--;}else{nums1[dst] = nums2[end2];dst--;end2--;}   }// end2 先结束不用管,end1先结束时,需要把nums2中的数据再拷贝过来while(end2 >= 0){nums1[dst] = nums2[end2];dst--;end2--;}}
};

算法代码优化

  • 利用后置--优化代码
class Solution {
public:void merge(vector<int>& nums1, int m, vector<int>& nums2, int n) {int end1 = m - 1, end2 = n - 1;int dst = nums1.size() - 1;// 只要有一个结束就结束while(end1 >= 0 && end2 >= 0){if(nums1[end1] >= nums2[end2])nums1[dst--] = nums1[end1--];elsenums1[dst--] = nums2[end2--];}// end2 先结束不用管,end1先结束时,end2还未结束,需要把nums2中的数据再拷贝过来while(end2 >= 0)nums1[dst--] = nums2[end2--];}
};

以上就是本文的所有内容了,如果觉得文章对你有帮助,欢迎 点赞⭐收藏 支持!如有疑问或建议,请在评论区留言交流,我们一起进步

分享到此结束啦
一键三连,好运连连!

你的每一次互动,都是对作者最大的鼓励!


征程尚未结束,让我们在广阔的世界里继续前行! 🚀

http://www.dtcms.com/a/395974.html

相关文章:

  • PromptPilot 发布:AI 提示词工程化新利器,首月零元体验
  • MySQL-详解数据库中的触发器
  • JVM调优实战及常量池详解
  • 字典树(Trie)
  • AI浏览器概述:Browser Use、Computer Use、Fellou
  • 「docker」三、3分钟快速安装docker
  • Altium Designer(AD)自定义PCB形状
  • 基于ZYNQ的创世SD NAND卡读写TXT文本实验
  • 文心快码入选2025人工智能AI4SE“银弹”标杆案例
  • 什么是SDN(Software Defined Netwok)
  • GitLab-如何基于现有项目仓库,复制出新的项目仓库
  • 本科大二第三周学习周报
  • 三、自定义Button模板触发器(纯XAML)
  • tar 将多个文件或目录打包成一个单独的归档文件
  • 2025新版 WSL2 + Docker Desktop 下载安装详细全流程指南 实现容器化管理,让开发效率起飞
  • 【LangChain4j】大模型实战-SpringBoot(阿里云百炼控制台)
  • Spring Security / Authorization Server 核心类中英文对照表
  • SqlHelper自定义的Sql工具类
  • 每周读书与学习->初识JMeter 元件(二)
  • 西门子 S7-200 SMART PLC 实操案例:中断程序的灵活应用定时中断实现模拟量滤波(上)
  • 测试分类(1)
  • 广州创科——湖北房县汪家河水库除险加固信息化工程(续集)
  • QT(5)
  • 仓颉语言宏(Cangjie Macros)全面解析:从基础到实战
  • linux RAID存储技术
  • 【每日一问】交流电和直流电有什么区别?
  • Postman使用指南
  • 软件架构面试题及答案
  • 【STM32】基于串口的bootloader
  • 【STM32】中断