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

问题概述

给你两个按非递减顺序排列的整数数组 nums1nums2。将 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 中的额外空间,而不需要额外的内存。

相关推荐
UrbanJazzerati44 分钟前
统计学的"测谎仪":一文搞懂方差、标准差与“N-1”的秘密
面试
颜酱44 分钟前
前端算法必备:滑动窗口从入门到很熟练(最长/最短/计数三大类型)
前端·后端·算法
轻竹办公PPT1 小时前
2025实测!AI生成PPT工具全总结
人工智能·python·powerpoint
做科研的周师兄1 小时前
【MATLAB 实战】栅格数据 K-Means 聚类(分块处理版)—— 解决大数据内存溢出、运行卡顿问题
人工智能·算法·机器学习·matlab·kmeans·聚类
彼岸花开了吗1 小时前
构建AI智能体:八十一、SVD模型压缩的艺术:如何科学选择K值实现最佳性能
人工智能·python·llm
X在敲AI代码1 小时前
leetcodeD3
数据结构·算法
踩坑记录1 小时前
leetcode hot100 560.和为 K 的子数组 medium 前缀和 + 哈希表
leetcode
码农小韩1 小时前
基于Linux的C++学习——循环
linux·c语言·开发语言·c++·算法
顾林海1 小时前
Android文件系统安全与权限控制:给应用数据上把“安全锁”
android·面试·操作系统
青莲8431 小时前
Android 动画机制完整详解
android·前端·面试