【每日一题】LeetCode - 合并两个有序数组

在这篇博客中,我们将讨论一个常见的编程问题:如何合并两个按非递减顺序排列的整数数组,使得合并后的数组仍然按非递减顺序排列。我们将通过一个具体的例子和 C++ 的实现来帮助大家理解这个过程。

问题描述

给定两个整数数组 nums1nums2,以及两个整数 mn,其中 m 表示 nums1 中的有效元素数量,而 n 表示 nums2 中的元素数量。我们的目标是将 nums2 合并到 nums1 中,使得合并后的数组仍然保持非递减顺序。

输入输出示例

示例 1:

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

示例 2:

  • 输入:nums1 = [1], m = 1, nums2 = [], n = 0
  • 输出:[1]

解决思路

  • 我们可以将两个数组合并成一个,然后对其进行排序,stlsort方法直接排完序之后返回,也可以使用快速排序对其进行排序返回(快速排序的平均时间复杂度为 O ( n log ⁡ n ) O(n \log n) O(nlogn),递归深度为 log ⁡ n \log n logn,每次操作需要的线性时间为 O ( n ) O(n) O(n))
  • 双指针法来解决这个问题。由于 nums1 的末尾包含足够的空间来容纳 nums2 中的所有元素,因此我们可以从后向前填充 nums1,这么做的时间复杂度是 O ( m + n ) O(m+n) O(m+n),空间复杂度是 O ( 1 ) O(1) O(1),因为我们最多循环m + n 次,由于没有占用额外的空间,所以时间复杂度是常数

具体步骤

排序

排序的方式很简单,先对两个数组合并然后直接sort就行了,我这里没有用这个办法,太简单了不想写。

双指针

  1. 定义两个指针 mn,分别指向 nums1nums2 的有效元素的最后一个索引。
  2. 定义一个指针 tail,指向合并后数组的最后一个位置。
  3. 比较 nums1[m-1]nums2[n-1],将较大的元素放到 nums1[tail] 中,并移动相应的指针。
  4. 如果 nums2 中的元素未完全处理完,则继续将剩余的元素填入 nums1
  5. 最终,nums1 将包含合并后的有序数组。
c++ 复制代码
class Solution {
public:
    void merge(vector<int>& nums1, int m, vector<int>& nums2, int n) {
        int tail = m + n - 1; // 合并后数组的最后一个位置
        while (n > 0 && m > 0) {
            // 从后向前比较并填充
            nums1[tail--] = nums1[m - 1] > nums2[n - 1] ? nums1[--m] : nums2[--n];
        }
        // 如果上面的循环循环完了,m中的元素可能已经全部取出,但n的元素不一定全部取出
        while (n > 0) {
            nums1[tail--] = nums2[--n];
        }
    }
};
代码解析
  • tail 初始化为 m + n - 1,指向合并后数组的最后一个位置。
  • while 循环中,我们比较 nums1nums2 中的元素,并将较大的元素放到 nums1[tail]。这确保了合并后的数组保持非递减顺序。
  • nums2 中还有元素未处理完时,我们需要将它们填入 nums1

时间复杂度和空间复杂度

  • 时间复杂度:O(m + n),因为我们需要遍历两个数组的所有元素。
  • 空间复杂度:O(1),由于我们在原地进行合并,不需要额外的空间。

结论

通过上述方法,我们成功地将两个有序数组合并为一个新的有序数组。希望这篇博客能帮助你理解合并有序数组的过程和相关的 C++ 实现

相关推荐
naruto_lnq几秒前
C++与自动驾驶系统
开发语言·c++·算法
啊阿狸不会拉杆5 分钟前
《数字信号处理》第6章:数字滤波器的基本概念及几种特殊滤波器
算法·matlab·信号处理·数字信号处理·dsp
放荡不羁的野指针16 分钟前
leetcode150题-双指针
数据结构·算法·leetcode
好学且牛逼的马30 分钟前
【Hot100|15-LeetCode 238. 除自身以外数组的乘积】
数据结构·算法·leetcode
Tisfy42 分钟前
LeetCode 3651.带传送的最小路径成本:动态规划
算法·leetcode·动态规划·题解·排序
努力学习的小廉44 分钟前
我爱学算法之—— 递归回溯综合(一)
算法·深度优先
m0_7369191044 分钟前
C++中的策略模式实战
开发语言·c++·算法
孞㐑¥1 小时前
算法—位运算
c++·经验分享·笔记·算法
软件算法开发1 小时前
基于卷尾猴优化的LSTM深度学习网络模型(CSA-LSTM)的一维时间序列预测算法matlab仿真
深度学习·算法·matlab·lstm·一维时间序列预测·卷尾猴优化·csa-lstm
高洁011 小时前
知识图谱如何在制造业实际落地应用
深度学习·算法·机器学习·数据挖掘·知识图谱