leetcode-88.合并两个有序数组(易理解)

双指针

为了合并两个已排序的数组 nums1nums2,并将结果存储在 nums1 中,我们可以采用双指针的方式从后向前进行合并。这种方法的好处是可以避免在nums1中移动元素,从而提高效率。

算法步骤

  1. 初始化三个指针:

    • p1 指向 nums1 的有效部分的最后一个元素,即 m - 1
    • p2 指向 nums2 的最后一个元素,即 n - 1
    • p 指向 nums1 的最后一个位置,即 m + n - 1
  2. 从后向前遍历数组:

    • 比较 nums1[p1]nums2[p2]
      • 如果 nums1[p1] > nums2[p2],将 nums1[p1] 赋值给 nums1[p],并将 p1p 向前移动一位。
      • 否则,将 nums2[p2] 赋值给 nums1[p],并将 p2p 向前移动一位。
  3. 如果 nums2 中还有剩余元素(即 p2 >= 0),将这些元素复制到 nums1 的前面。

代码实现

java 复制代码
class Solution {
    public void merge(int[] nums1, int m, int[] nums2, int n) {
        // corner case
        // core
        int p1 = m - 1, p2 = n - 1, p = m + n - 1;
        while (p1 >= 0 && p2 >= 0) {
            if (nums1[p1] > nums2[p2]) {
                nums1[p--] = nums1[p1--];
            } else {
                nums1[p--] = nums2[p2--];
            }
        }
        while (p2 >= 0) {
            nums1[p--] = nums2[p2--];
        }
    }
}
python 复制代码
def merge(nums1, m, nums2, n):
    # 设置指针
    p1, p2, p = m - 1, n - 1, m + n - 1
    
    # 从后向前合并
    while p1 >= 0 and p2 >= 0:
        if nums1[p1] > nums2[p2]:
            nums1[p] = nums1[p1]
            p1 -= 1
        else:
            nums1[p] = nums2[p2]
            p2 -= 1
        p -= 1
    
    # 如果 nums2 还有剩余元素,直接复制到 nums1
    # 如果 nums1 还有剩余元素,不需要处理,因为它们已经在正确的位置
    nums1[:p2 + 1] = nums2[:p2 + 1]

# 示例用法
nums1 = [1, 2, 3, 0, 0, 0]
m = 3
nums2 = [2, 5, 6]
n = 3
merge(nums1, m, nums2, n)
print(nums1)  # 输出: [1, 2, 2, 3, 5, 6]

复杂度分析

  • 时间复杂度 :O(m + n),因为我们最多需要遍历 nums1nums2 各一次。
  • 空间复杂度 :O(1),因为我们是直接在 nums1 上进行修改,没有使用额外的空间。
相关推荐
Raink老师2 小时前
【AI面试临阵磨枪-79】实时数据 RAG:订单、商家、物流、天气、动态库存
人工智能·面试·职场和发展
Cosolar2 小时前
Chroma向量库面试学习指南
数据库·人工智能·面试·职场和发展·数据库架构
kkeeper~3 小时前
0基础C语言积跬步之数据在内存中的存储
c语言·数据结构·算法
wabs6665 小时前
关于贪心算法的一些自我总结【力扣45.跳跃游戏II】【灵感来源:代码随想录】
算法·贪心算法·复盘
2401_876964135 小时前
【湖北专升本】2026湖北专升本真题PDF+备考资料汇总
数据结构·人工智能·经验分享·深度学习·算法·计算机视觉
嗝o゚5 小时前
CANN GE 算子融合——融合算法与调度策略
算法·昇腾·cann·ge
小江的记录本6 小时前
【JVM虚拟机】垃圾回收GC:垃圾回收算法:标记-清除、标记-复制、标记-整理、分代收集(附《思维导图》+《面试高频考点清单》)
java·jvm·后端·python·算法·安全·面试
Ulyanov7 小时前
用声明式语法重新定义Python桌面UI:QML+PySide6现代开发入门(一)
开发语言·python·算法·ui·系统仿真·雷达电子对抗仿真
数据科学小丫7 小时前
特征工程处理
人工智能·算法·机器学习
秦明月137 小时前
电芯装配测试线安全回路设计实战
经验分享·其他·职场和发展·创业创新·学习方法