Leetcode 88题.合并两个有序数组的解题思路以及C++、java、python实现

限时加码!20+主流AI编程工具免费用 购周边加赠Coding Plan Lite,Claude Code、Cursor等即刻畅享,学习进阶更高效! 阅读详情

Leetcode 88题.合并两个有序数组

题目描述:

给你两个有序整数数组 nums1 和 nums2,请你将 nums2 合并到 nums1 中,使 nums1 成为一个有序数组。

 

说明:

初始化 nums1 和 nums2 的元素数量分别为 m 和 n 。
你可以假设 nums1 有足够的空间(空间大小大于或等于 m + n)来保存 nums2 中的元素。
 

示例:

输入:
nums1 = [1,2,3,0,0,0], m = 3
nums2 = [2,5,6],       n = 3

输出:[1,2,2,3,5,6]

解题思路:

从最后面的数比较开始,定义三个指针,指针 i 指向有序数组nums1的最大数,指针 j 指向nums2数组的最大数, 指针 k 指向数组nums1最后的索引即 k = m +n - 1.

从后面比较nums1与nums2,逐渐将两个数组的数按照从大到小从后面插入到数组nums1中。

这里要注意两点:

(1)m=0的情况,即有序数组nums1是没有非零整数的。

(2)当指针i遍历完后, 指针 j 可能还没遍历完数组nums2,所以后面要再加一个循环将nums2剩余的数插入到nums1中。

C++实现:

class Solution {
public:
    void merge(vector<int>& nums1, int m, vector<int>& nums2, int n) {
        int i=m-1, j=n-1, k=m+n-1;
        if(m==0) nums1[k] = nums2[j];
        while(j >= 0 && i >= 0){
            if(nums1[i] < nums2[j]){
                nums1[k--] = nums2[j--];
            }
            else if (nums1[i] > nums2[j]){
                nums1[k--] = nums1[i--];
            }
            else{
                nums1[k--] = nums2[j--];
                nums1[k--] = nums1[i--];
            }
        }
        while(j >= 0){
            nums1[k--] = nums2[j--];
        }
    }
};

java实现:

class Solution {
    public void merge(int[] nums1, int m, int[] nums2, int n) {
        int i=m-1, j=n-1, k=m+n-1;
        if(m==0) nums1[k] = nums2[j];
        while(j >= 0 && i >= 0){
            if(nums1[i] < nums2[j]){
                nums1[k--] = nums2[j--];
            }
            else if (nums1[i] > nums2[j]){
                nums1[k--] = nums1[i--];
            }
            else{
                nums1[k--] = nums2[j--];
                nums1[k--] = nums1[i--];
            }
        }
        while(j >= 0){
            nums1[k--] = nums2[j--];
        }
    }
}

python实现:

class Solution(object):
    def merge(self, nums1, m, nums2, n):
        """
        :type nums1: List[int]
        :type m: int
        :type nums2: List[int]
        :type n: int
        :rtype: None Do not return anything, modify nums1 in-place instead.
        """
        i, j, k = m-1, n-1, m+n-1
        if m==0: 
            nums1[k] = nums2[j]
        while j >= 0 and i >= 0:
            if nums1[i] < nums2[j]:
                nums1[k] = nums2[j]
                k -= 1
                j -= 1
            elif nums1[i] > nums2[j]:
                nums1[k] = nums1[i]
                k -= 1
                i -= 1
            else:
                nums1[k] = nums2[j]
                k -= 1
                j -= 1
                nums1[k] = nums1[i]
                k -= 1
                i -= 1
            
        while j >= 0:
            nums1[k] = nums2[j]
            k -= 1
            j -= 1
        

 

双指针算法实现有序数组去重详解 双指针算法是处理有序数组去重问的高效解决方案,通过维护快慢两个指针实现O(n)时间复杂度和O(1)空间复杂度。该算法的核心原理是利用数组有序性,通过相邻元素比较来识别重复项。在工程实践中,这种技术广泛应用于数据库记录去重、日志处理和时间序列数据分析等场景。以LeetCode经典目为例,双指针解法相比暴力方法性能提升显著,特别适合处理大规模数据集。掌握快慢指针的移动策略和边界条件处理,是算法工程师必备的基础技能之一。 阅读详情

相关推荐

CentOS7下通过YUM源高效部署Zabbix7 Agent指南

本文详细指导在已结束生命周期的CentOS7系统上,通过更换YUM源(如阿里云镜像)并添加Zabbix官方仓库,高效部署Zabbix7 Agent。文章涵盖从源配置、软件安装、关键参数修改到服务启动与防火墙设置的全流程,帮助用户解决依赖错误,快速建立服务器监控。

weixin_29230059的博客 249

LeetCode88合并二个有序数组

目: 给你两个有序整数数组nums1nums2,请你将 nums2 合并nums1中,使 nums1 成为一个有序数组。 说明: 初始化nums1nums2 的元素数量分别为m 和 n 。 你可以假设nums1有足够的空间(空间大小大于或等于m + n)来保存 nums2 中的元素 目已经给提示了,数组这种操作一般都是在数组后面,因为为O(1),思路跟链表...

weibozhouchao的博客 188

Qt Creator设计器里也能拖拽?5步将你的QML自定义控件变成可视化插件(Qt6.5+)

本文详细介绍了如何在Qt Creator设计器中实现QML自定义控件的可视化拖拽功能(Qt6.5+)。通过5个步骤,从构建可插件化的QML控件基础到部署插件到设计器环境,帮助开发者将自定义控件转化为设计器插件,提升团队协作效率。特别适合需要频繁调整UI样式的开发场景。

weixin_29214559的博客 140

4. 两个排序数组的中位数 给定两个大小为 m 和 n 的有序数组 nums1nums2 。 请找出这两个有序数组的中位数。要求算法的时间复杂度为 O(log (m+n)) 。

使用数组的归并。  不过时间复杂度不行,满足不了要求。 double findMedianSortedArrays(int* nums1, int nums1Size, int* nums2, int nums2Size) { int num[nums1Size + nums2Size]; int i = 0, j = 0, k = 0; double a; ...

weixin_38650119的博客 3298

leetcode88)——415. 字符串相加

给定两个字符串形式的非负整数 num1 和num2 ,计算它们的和。 提示: num1 和num2 的长度都小于 5100 num1 和num2 都只包含数字 0-9 num1 和num2 都不包含任何前导零 你不能使用任何內建 BigInteger 库, 也不能直接将输入的字符串转换为整数形式 我的思路1.2个字符串如果长度不一样,则对于短的字符串,前面进行0补位 2.从后面开始相加,因为要处理大于10进位问,我之前按正序进行相加,就会出现进位出错问 3.进位还有个问,就是for循环结束了,第一

一个码农的博客 342

解题思路-LeetCode88合并两个有序数组

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

weixin_48153141的博客 274

合并两个有序数组

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

qq_35692267的博客 245

【经典算法】 leetcode88.合并排序的数组(Java/C/Python3实现含注释说明,Easy)

解题方式优点缺点时间复杂度空间复杂度其他注意事项从前往后双指针(原地修改)无需额外空间,原地修改逻辑相对复杂,需要正确处理合并细节O(m + n)O(1)需要确保nums1有足够空间从前往后双指针(需要额外空间)逻辑简单,易于理解需要额外空间存放合并结果O(m + n)O(m + n)适用于空间限制不严格的情况这两种方式都是解决合并两个有序数组的有效方法。选择哪种方式取决于具体的性能要求和内存限制。如果内存空间有限,或者希望避免额外的空间开销,可以选择原地修改的方式。

1518

leetcode面试经典150day1

原地移除,使用for循环遍历,使用一个变量计数,如果nums中的元素等于val,则不计数,否则计数加1,创建数组,当nums中的元素不等于val时,添加到nums中。你的函数应该返回 k = 5,并且 nums 中的前五个元素为 0,0,1,3,4。// 排序 nums 的前 k 个元素。,5,6] ,其中斜体加粗标注的为 nums1 中的元素。你的函数函数应该返回 k = 2, 并且 nums。需要合并 [1,2,3] 和 [2,5,6]。最后剩余的一个数组元素没取完,继续放入新数组中。

qq_62898665的博客 540

LeetCode - 4 寻找两个正序数组的中位数

目来源 4. 寻找两个正序数组的中位数 - 力扣(LeetCode目描述 给定两个大小分别为 m 和 n 的正序(从小到大)数组 nums1nums2。请你找出并返回这两个正序数组的 中位数 。 算法的时间复杂度应该为 O(log (m+n)) 。 示例 1 输入:nums1 = [1,3], nums2 = [2] 输出:2.00000 解释:合并数组 = [1,2,3] ,中位数 2 示例 2 输入:nums1 = [1,2], nums2 = [3,4]

CSDN 1069

LeetCode-简单】88. 合并两个有序数组python c++

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

cyril_的博客 273

[C++]Leetcode超高效刷顺序及目详解笔记(持续更新中)

.引言 博主最近在LeetCode上用C++练习。一路走来踩过一些坑,做了一些总结和笔记,分享给需要的人。 LeetCode网址:https://leetcode.com/ LeetCode中文版:https://leetcode-cn.com/ 二.指南 LeetCode 是一个非常棒的平台,收集了许多公司的面试目。相对其他平台而言,有着下面的几个优点: 目全部来自业内大公司的真实面试不用处理输入输出 精力全放在解决具体问目有丰富的讨论 可以参考别人的思路精确了解自己代码在所有提交代码中

cpb____的博客 2万+

python 双指针_python算法双指针问两个有序数组合并

最近在看《你也能看得懂的python算法书》,自己来实现一下里面的算法吧。有书里的有所不同。比如这个目,我的实现如下:from django.test import TestCaseimport copy# Create your tests here.a_list = [3, 5, 8, 45, 78, 2345]b_list = [2, 5, 8, 23, 46, 89, 3235]a_le...

weixin_39968592的博客 323

leetcode经典目分析(Java + Python + Golang + C++):合并两个有序数组

给你两个按 非递减顺序 排列的整数数组 nums1nums2,其中 nums1 的大小为 m + n,表示 nums1 有足够的空间(还剩 n 个元素的空间)接收 nums2 中的元素。解释:需要合并 [1, 2, 3] 和 [2, 5, 6] ,合并结果是 [1, 2, 2, 3, 5, 6]。输入: nums1 = [1,2,3,0,0,0], m = 3, nums2 = [2,5,6], n = 3。输出:[1,2,2,3,5,6]时间复杂度:O(m + n)空间复杂度:O(1)

理想是做一个自由的coder 441

LeetCode 4. Median of Two Sorted Arrays Python3

LeetCode 4. Median of Two Sorted Arrays Python3 Description 点击查看目 There are two sorted arrays nums1 and nums2 of size m and n respectively. Find the median of the two sorted arrays. The overall run t...

与你的博客 417

[LeetCode] 004. Median of Two Sorted Arrays (Hard) (C++/Java/Python)

[LeetCode] 004. Median of Two Sorted Arrays (Hard) (C++/Java/Python)

水果君の日常 6450

LeetCode高效刷指南:谷歌方法论与本地化实践

算法与数据结构是计算机科学的核心基础,其原理在于通过特定的数据组织和操作逻辑,高效解决计算问。掌握核心算法模式,如动态规划、哈希表和滑动窗口,能显著提升问解决能力,具有极高的技术价值,尤其在优化程序性能和处理大规模数据时至关重要。这些技术的典型应用场景包括搜索引擎、推荐系统、金融风控以及,最直接相关的,技术面试中的编程能力考察。对于准备面试的开发者而言,系统化地刷是巩固这些知识的有效途径。本文聚焦于一份被广泛验证的LeetCode方法论,即所谓的“谷歌大佬推荐宝典”,它本质上是一套提炼了高频考点和

weixin_34161083的博客 401

leetcode记录之977

977、有序数组的平方   给定一个按非递减顺序排序的整数数组 A,返回每个数字的平方组成的新数组,要求也按非递减顺序排序。 示例 1: 输入:[-4,-1,0,3,10] 输出:[0,1,9,16,100] 示例 2: 输入:[-7,-3,2,3,11] 输出:[4,9,9,49,121] 提示: 1 <= A.length <= 10000 -10000 <= A[i]...

qq_41278826的博客 230

10个LeetCode高频算法类型全解析:基于gh_mirrors/leetcode21/leetcode项目

如果你正在准备技术面试或想提升编程能力,掌握LeetCode高频算法类型是必不可少的。本指南基于gh_mirrors/leetcode21/leetcode项目,为你解析10个最重要的算法类型,帮助你快速提升解题能力。这个项目包含了229道LeetCode解,涵盖C++JavaPython、SQL和Shell Script多种语言实现,是学习算法和数据结构的最佳资源。 ## 📊 为什么算

gitblog_00434的博客 1069

LeetCode——10th

难度:简单/Easy 序号与难度:83——删除排序链表的重复元素 给定一个排序链表,删除所有重复的元素,使得每个元素只出现一次。 示例 1: 输入: 1-&gt;1-&gt;2 输出: 1-&gt;2 示例 2: 输入: 1-&gt;1-&gt;2-&gt;3-&gt;3 输出: 1-&gt;2-&gt;3 思考:由于输入的链表已排序,因此我们可以通过将结点的值与它之后的结点进行比较来...

longlongsvip的博客 156
上一篇: Leetcode 66题 加一 解题思路以及C++、java、python实现
下一篇: Bert,Albert,Roberta,XLNet的中英文预训练模型下载网址及教程
TanH.blog
博客等级 码龄9年 1万+粉丝 70原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

TanH.blog

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

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

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

打赏作者

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

抵扣说明:

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

余额充值