力扣(LeetCode) 88: 合并两个有序数组 - 解法思路

问题概述

给你两个按非递减顺序排列的整数数组 nums1 和 nums2。将 nums2 合并到 nums1 中,使合并后的数组同样按非递减顺序排列。nums1 的长度为 m + n,其中前 m 个元素是有效的,后 n 个元素设置为 0 且应被忽略。

解法 1:从末尾双指针(推荐)

工作原理

从两个数组的末尾开始合并,以避免覆盖 nums1 中尚未处理的元素:

python 复制代码
class Solution:
    def merge(self, nums1, m, nums2, n):
        i = m - 1  # nums1 中最后一个有效元素
        j = n - 1  # nums2 中最后一个元素
        k = m + n - 1  # nums1 中最后一个位置
        
        # 从末尾开始合并
        while i >= 0 and j >= 0:
            if nums1[i] > nums2[j]:
                nums1[k] = nums1[i]
                i -= 1
            else:
                nums1[k] = nums2[j]
                j -= 1
            k -= 1
        
        # 复制 nums2 中剩余元素(如果有)
        while j >= 0:
            nums1[k] = nums2[j]
            j -= 1
            k -= 1

复杂度分析

  • 时间复杂度: O(m + n) - 单次遍历两个数组
  • 空间复杂度: O(1) - 只使用常数额外空间

何时使用

  • 推荐 - 最优解
  • 从末尾合并避免覆盖未处理的元素
  • 处理所有边界情况,包括一个数组为空的情况

关键洞察

从末尾合并至关重要,因为:

  • 如果从开头合并,我们会覆盖 nums1 中尚未处理的元素
  • 通过从末尾开始,我们首先使用 nums1 末尾的额外空间
  • 这确保我们在合并过程中不会丢失任何数据

对比

方法 时间 空间 最佳适用
双指针(末尾) O(m + n) O(1) 大多数情况,最优解

总结

从末尾开始的双指针技术是原地合并有序数组的最优解决方案。这种方法高效地使用 nums1 中的额外空间,而不需要额外的内存。

相关推荐
懂点Tech1 天前
ctfshow misc28:GIF 高度修改解题与脚本实现
开发语言·windows·python
comedate1 天前
SMLib 的 Examples 导读:PyAPI / SM_API / SMLib 三组示例怎么读
python·cad·smlib·examples·sm_api
微尘hjx1 天前
【ByteTrack 04】多轨迹算法ByteTrack改进点
算法·yolo·目标检测·目标跟踪·bytetrack·ultralytics·车跟踪
云和数据.ChenGuang1 天前
Python 重写(Override)深度解析:从 MRO 到 super() 的完整机制
java·开发语言·人工智能·python·langchain·1024程序员节
川石课堂软件测试1 天前
学习软件测试需掌握的一些知识
数据库·python·sql·功能测试·网络协议·mysql·http
万化冥合1 天前
PyBox屏幕键盘如何辅助演示键盘操作?
python·计算机外设
车软学堂1 天前
从测试转开发,到底要补什么
网络·人工智能·python·功能测试·单片机·车载系统·自动化
天空依然蔚蓝1 天前
分享一个自动检测网站在线状态的python程序
python·运维开发·1024程序员节
岁月宁静1 天前
一个 AI 项目从本地到上线,要经过哪些步骤?全流程讲清楚
python·docker·agent
Cosolar1 天前
不收费、不加水印、数据归你:我做了个开源的在线简历工具
后端·面试·前端框架