Leetcode88. 合并两个有序数组

LeetCode 88 - 合并两个有序数组 是非常基础的数组操作题目,考察双指针、逆序操作和空间优化等技巧。这个问题相当经典,对后续的归并排序、多指针问题、双数组相关问题都有指导意义。以下是详细的解法、模板与变体问题讲解。给定你两个有序整数数组nums1和nums2,以及两个非负整数m和n,表示分别代表数组nums1和nums2中的有效元素个数。将nums2中的所有元素合并到nums1中,使数组变为一个有序数组。 阅读详情

Every day a leetcode

题目来源:88. 合并两个有序数组

解法1:排序

将nums2拼接到nums1的末尾,再对nums1排序,即为答案。

代码:

C版本:

int cmpfunc (const void * a, const void * b)
{
   return ( *(int*)a - *(int*)b );
}
void merge(int* nums1, int nums1Size, int m, int* nums2, int nums2Size, int n){
    for(int i=0;i<n;i++) nums1[m+i]=nums2[i];
    qsort(nums1,nums1Size,sizeof(int),cmpfunc);
}

C++版本(2023.6.5更新):

/*
 * @lc app=leetcode.cn id=88 lang=cpp
 *
 * [88] 合并两个有序数组
 */

// @lc code=start
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());
    }
};
// @lc code=end

结果:

在这里插入图片描述

解法2:双指针+辅助空间

使用两个指针分别指示nums1,nums2。

使用一个额外数组空间数组存储排序结果,最后复制回nums1。

代码:

void merge(int* nums1, int nums1Size, int m, int* nums2, int nums2Size, int n){
    int p=0;
    int q=0;
    int cur;
    int sort_nums[m+n];

    while (p<m || q<n)
    {
        if (p == m) cur=nums2[q++];
        else if(q == n) cur=nums1[p++];
        else if(nums1[p]<nums2[q]) cur=nums2[q++];
        else cur=nums2[p++];
        sort_nums[p+q-1]=cur;
    }
    for(int i=0;i<m+n;i++)
    {
        nums1[i]=sort_nums[i];
    }
}

结果:
在这里插入图片描述

解法3:逆向双指针

定义两个指针,指向2个数组,指针设置为从后向前遍历,每次取两者之中的较大者放进nums1的最后面。

代码:

void merge(int* nums1, int nums1Size, int m, int* nums2, int nums2Size, int n){
    int p=m-1;
    int q=n-1;
    int tail=m+n-1;
    int cur;
    while(p>=0 || q>=0)
    {
        if(p == -1) cur=nums2[q--];
        else if(q == -1) cur=nums1[p--];
        else if(nums1[p]>=nums2[q]) cur=nums1[p--];
        else cur=nums2[q--];
        nums1[tail--]=cur;
    }
}

C++版本(2023.6.5更新):

/*
 * @lc app=leetcode.cn id=88 lang=cpp
 *
 * [88] 合并两个有序数组
 */

// @lc code=start
// 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 Solution
{
public:
    void merge(vector<int> &nums1, int m, vector<int> &nums2, int n)
    {
        int pos = m-- + n-- - 1;
        while (m >= 0 && n >= 0)
        {
            nums1[pos--] = nums1[m] > nums2[n] ? nums1[m--] : nums2[n--];
        }
        while (n >= 0)
        {
            nums1[pos--] = nums2[n--];
        }
    }
};
// @lc code=end

结果:

在这里插入图片描述

【简单】力扣算法题解析LeetCode88:合并两个有序数组 合并两个有序数组的算法题解:使用双指针从后向前填充,避免覆盖元素。核心思路是比较nums1和nums2末尾元素,将较大者放入nums1尾部,处理剩余元素后即可完成合并。时间复杂度O(m+n),空间复杂度O(1)。提供Java实现代码,适用于非递减数组的原地合并。 阅读详情

相关推荐

SolidWorks的GB库(钢型材库,包括铝型材、铝管等结构)安装及使用教程(生成铝型材为例)

1、GB库的下载 2、GB库的安装教程 3、GB库的使用教程

树下等苹果的博客 12万+

[力扣LeetCode]88-合并两个有序数组

[力扣LeetCode]88-合并两个有序数组

JoeyTanHDU的博客 595

基于的公司考勤系统(程序+开题报告)(开题报告+源码)

我们将研究和设计系统的架构和功能模块,包括员工信息管理模块、部门信息管理模块、考勤信息记录模块、工资信息计算模块、请假信息处理模块、奖惩信息管理模块、公告信息发布模块、上班打卡模块以及加班申请模块等。目的: 本项目旨在设计并实现一个基于的公司考勤系统,通过该系统,可以实现对员工、部门信息、考勤信息、工资信息、请假信息、奖惩信息、公告信息、上班打卡、加班申请等功能的统一管理。基于的公司考勤系统的设计与实现,旨在通过自动化技术提高考勤管理的效率和准确性,为企业管理提供有力的数据支持。最终成品以下面运行环境。

迟限程序设计 997

力扣简单题系列:合并两个有序数组(LeetCode 88)

这道题通过双指针法,高效地将两个有序数组合并为一个有序数组。对于初学者来说,掌握双指针的思想是解决类似问题的关键。

weixin_53910667的博客 794

深入了解 Google Gemini:主要功能是什么以及我们为什么要使用它?

Google Gemini开启AI新纪元,以其独特的多模式功能重塑技术未来。

KompasAI的博客 4063

深入解析安卓/Linux固件:从DTB到DTS的反编译实战

本文详细介绍了如何从安卓/Linux设备固件中提取并反编译DTB文件,将其转换为可读的DTS源码。通过实战步骤,包括拆解boot.img、处理resource.img以及使用dtc工具,帮助开发者深入理解设备硬件配置,为固件定制、驱动调试和系统移植提供关键支持。

weixin_29274337的博客 339

力扣每日一道系列 --- LeetCode 88. 合并两个有序数组

LeetCode 88. 合并两个有序数组 思路1:暴力求解 思路二:原地合并 如果大家有什么疑问可以在评论区与我讨论,或者直接私信我,感谢大家的阅读哦 ~

深入解析C/C++编程技巧,带你探索高效开发之路 2644

从课堂笔记到动手实践:用Multisim仿真高频谐振功放(丙类)的完整流程

本文详细介绍了使用Multisim仿真高频谐振功放(丙类)的完整流程,从仿真环境准备到电路搭建、偏置网络设计、信号注入与波形观测,再到效率优化与性能验证。通过14个关键操作步骤,帮助读者将高频电子线路的理论知识转化为动手实践,深入理解丙类功放的非线性工作状态和效率优化技巧。

weixin_30701575的博客 518

力扣 P88 合并两个有序数组

力扣 P88 合并两个有序数组 题目 给定两个有序整数数组 nums1 和 nums2,将 nums2 合并到 nums1 中,使得 num1 成为一个有序数组。 说明: 初始化 nums1 和 nums2 的元素数量分别为 m 和 n。 你可以假设 nums1 有足够的空间(空间大小大于或等于 m + n)来保存 nums2 中的元素。 示例: 输入: nums1 = [1,2,3,0,0,0...

hyj1109421943的博客 340

【目标检测】基于yolov5的安全帽佩戴检测系统(附代码和数据集)

【目标检测】基于yolov5的安全帽佩戴检测系统(附代码和数据集)

学无止境、积少成多、厚积薄发 3105

论文复现5:UMI Universal Manipulation Interface

UMI 采用手持式夹具,加上精心的界面设计,可实现便携式、低成本和信息丰富的数据收集,以进行具有挑战性的双手和动态操作演示。配备这些功能后,UMI 框架解锁了新的机器人操作功能,只需更改每个任务的训练数据,即可实现零样本可推广的动态、双手、精确和长视野行为。我们通过全面的现实世界实验展示了 UMI 的多功能性和有效性,其中通过 UMI Zeroshot 学习的策略在对不同的人类演示进行训练时可以推广到新的环境和对象。项目主页:https://umi-gripper.github.io/

github_38060285的博客 1972

LeetCode 力扣 88. 合并两个有序数组

题目描述(简单难度) 给两个有序数组,把第二个数组合并到第一个数组中,保持有序。可以注意到第一个数组已经为我们多开辟了第二个数组所需要的空间。 解法一 直接法 简单粗暴,nums1 作为被插入的数组,然后遍历 nums2。用两个指针 i 和 j ,i 指向 nums1 当前判断的数字,j 指向 num2 当前遍历的数字。如果 j 指向的数字小于 i 指向的数字,那么就做插入操作。否则的话后移 i...

wind_liang的博客 973

n8n AI高效工作流自动化 部署使用教程

摘要: n8n是一款开源可视化工作流自动化工具,结合AI能力可高效解决重复性任务。文章详细介绍了从Docker部署到实战应用的完整流程:1)通过Docker Compose自托管n8n,确保数据可控;2)以AI客服日报机器人为例,演示如何串联工单系统、ChatGPT和邮件通知,实现定时自动化;3)进阶搭建交互式AI助手,利用ToolsAgent节点调用业务API;4)整合向量数据库构建RAG知识库问答。关键建议包括:拆分复杂工作流、严格管理凭据、区分开发与生产环境,并建议从高频刚性需求(如日报生成)切入,逐

专注AI大模型,软件混淆,授权 264

88.力扣LeetCode_合并两个有序数组

文章摘要: 该代码实现了合并两个有序数组的功能,其中nums1数组预留了足够空间。算法采用从后向前遍历的方式,通过三个指针分别标记nums1有效元素末尾、nums2末尾和合并位置。核心思想是比较两数组当前元素,将较大值放入nums1末端,依次向前填充。最后处理剩余元素,确保所有数据有序合并。时间复杂度为O(m+n),空间复杂度O(1),是一种高效的原位合并方法。注释详细说明了参数含义和指针移动逻辑。

2401_82472941的博客 264

华为的C语言编程规范.pdf

华为技术有限公司内部技术规范。本规范制定了编写C语言程序的基本原则、规则和建议。从代码的清晰、简洁、可测试、安全、程序效率、可移植各个方面对C语言编程作出了具体指导。

Devexpress16.2.6破解工具

Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具

【leetCode88】合并两个有序数组

leetCode第88题

日出等日落 199

efm32 入门.pdf

本PDF共计22页,介绍的是操作驱动API,下载与否自己斟酌。

leetcode88. 合并两个有序数组,倒着做

leetcode88. 合并两个有序数组,倒着做

热爱C++和golang的学生 1120

OV9734 DATASHEET,完整规格书

OV9734完整规格书,包括电气参数,尺寸规格,寄存器配置表等

力扣(LeetCode) 88. 合并两个有序数组 python3

本来这种题不打算写题解的,因为之前做的题别人都有一堆优秀的题解,自己的又臭又长还占时间内存,写完这道题后发现比目前这道题靠前的python3题解代码都短,还是很有成就感的,就是好像运行时间大部分时候都在百分之五十以下,时间复杂度不太会看QAQ不过python之禅都说了,简单易懂就好~下面是题目: 给你两个有序整数数组nums1 和 nums2,请你将 nums2 合并到nums1中,使 n...

菜鸟的博客 436

【Java力扣算法】Leetcode 88 合并两个有序数组

题目: 给定两个有序整数数组nums1和nums2,将nums2合并到nums1中,使得num1成为一个有序数组。 说明: 初始化nums1和nums2的元素数量分别为m和n。 你可以假设nums1有足够的空间(空间大小大于或等于m + n)来保存nums2中的元素。 示例: 输入: nums1 = [1,2,3,0,0,0], m =...

懂技术的猫 374

LeetCode每日一练 —— 88. 合并两个有序数组

leetcode 88. 合并两个有序数组

Edison's 小宇宙 1万+

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

给你两个按排列的整数数组nums1和nums2,另有两个整数m和n,分别表示nums1和nums2中的元素数目。请你nums2到nums1中,使合并后的数组同样按排列。最终,合并后数组不应由函数返回,而是存储在数组nums1中。为了应对这种情况,nums1的初始长度为m + n,其中前m个元素表示应合并的元素,后n个元素为0,应忽略。nums2的长度为n。

qq_40263592的博客 1227

LeetCode 88 合并两个有序数组

LeetCode 88 合并两个有序数组 题目 给定两个有序整数数组 nums1 和 nums2,将 nums2 合并到 nums1 中,使得 num1 成为一个有序数组。 说明: 初始化 nums1 和 nums2 的元素数量分别为 m 和 n。 你可以假设 nums1 有足够的空间(空间大小大于或等于 m + n)来保存 nums2 中的元素。 示例: 输入: nums1 = [1,2,3,0...

sakurasakura1996的博客 277

leetcode88.合并两个有序数组

leetcode88.合并两个有序数组 给定两个有序整数数组 nums1 和 nums2,将 nums2 合并到 nums1 中,使得 num1 成为一个有序数组。 说明: 初始化 nums1 和 nums2 的元素数量分别为 m 和 n。 你可以假设 nums1 有足够的空间(空间大小大于或等于 m + n)来保存 nums2 中的元素。 示例: 输入: nums1 = [1,2,3,0,0,0...

yyf_blog 589

力扣---LeetCode88. 合并两个有序数组

第七弹 --- 力扣LeetCode每日一题

小沈.的博客 1063

LeetCode面试150——88合并两个有序数组

Leetcode面试经典150题第88题合并两个有序数组

Junmo12345的博客 1454

力扣leetcode 88. 合并两个有序数组 java

class Solution { public void merge(int[] nums1, int m, int[] nums2, int n) { int[] nums3 = new int[m]; for(int i=0; i<m; i++) nums3[i] = nums1[i]; int i=0, j=0, k=0; ...

izhxxx的博客 630

从今天开始重刷力扣 Leetcode 88. 合并两个有序数组 双指针

Leetcode 88. 合并两个有序数组 双指针

想买很多漂亮衣服但是买不起的博客 369
上一篇: Leetcode53. 最大子数组和
下一篇: Leetcode350. 两个数组的交集 II
UestcXiye
博客等级 码龄8年 9027粉丝 1306原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

UestcXiye

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值