【C++刷题】力扣-#88-合并两个有序数组

题目描述

给定两个有序整数数组 nums1 和 nums2,其中 nums1 的长度为 m,nums2 的长度为 n。假设 nums1 的大小等于 m + n(即 nums1 有足够的空间存放 nums2 的元素)。你需要将 nums2 合并到 nums1 中,使合并后的数组仍然有序。

示例

示例 1

bash 复制代码
输入:
nums1 = [1,2,3,0,0,0], m = 3
nums2 = [2,5,6],       n = 3
输出: [1,2,2,3,5,6]
解释: 合并后的数组已按非递减顺序排序。

示例 2

bash 复制代码
输入:
nums1 = [4,5,6,0,0,0], m = 3
nums2 = [1,2,3],       n = 3
输出: [1,2,3,4,5,6]
解释: 合并后的数组已按非递减顺序排序。

题解

这个问题可以通过双指针法来解决。我们从两个数组的末尾开始,比较并移动较大的元素到 nums1 的末尾。

  1. 初始化指针:设置两个指针 p1 和 p2 分别指向 nums1 和 nums2 的末尾元素。
  2. 从后向前合并:从 nums1 的末尾开始,比较 nums1p1-1 和 nums2p2-1,将较大的元素移动到 nums1 的末尾,并更新指针。
  3. 处理剩余元素:如果 nums2 中还有剩余元素,直接将它们复制到 nums1 的前面。

代码实现

cpp 复制代码
void merge(vector<int>& nums1, int m, vector<int>& nums2, int n) {
    int p1 = m - 1;
    int p2 = n - 1;
    int p = m + n - 1; // nums1 的末尾位置
    
    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--];
    }
}

复杂度分析

● 时间复杂度:O(m + n),其中 m 和 n 分别是 nums1 和 nums2 的长度。我们需要遍历两个数组。

● 空间复杂度:O(1),因为我们是在原地修改 nums1,没有使用额外的空间。

这个算法的优势在于它直接在 nums1 上进行操作,不需要额外的数组空间。

相关推荐
从零开始的代码生活_15 小时前
NAT、代理服务与内网穿透详解
linux·服务器·网络·c++·http·智能路由器
aaaameliaaa15 小时前
进制练习题【找出只出现一次的数字、交换两个变量(不创建临时变量)、统计二进制中1的个数、打印整数二进制的奇数位和偶数位、求两个数二进制中不同位的个数】
c语言·数据结构·笔记·算法
charlie11451419116 小时前
Cinux: 加载第一个内核:从 bootloader 跳进 C++
linux·开发语言·c++·嵌入式
QiLinkOS17 小时前
第三视觉理解徐玉生与他的商业活动(28)
大数据·c++·人工智能·算法·开源协议
星夜夏空9917 小时前
C++学习(2) —— 类与对象基础
开发语言·c++·学习
wabs66617 小时前
关于动态规划【力扣1143.最长公共子序列的思考】
算法·leetcode·动态规划
剑挑星河月18 小时前
54.螺旋矩阵
java·算法·leetcode·矩阵
Robot_Nav18 小时前
MPPI 局部规划器实验设计讲解
人工智能·算法·mppi
mingo_敏18 小时前
Mean-Teacher 均值教师自训练框架详解
算法·均值算法
会周易的程序员19 小时前
microLog 后端开发指南
开发语言·c++·物联网·设计模式·日志·iot·aiot