leetcode 面试经典 150 题:合并两个有序数组

news/2024/12/27 3:13:08/
链接合并两个有序数组
题序号88
题型数组
解题方法1. 双指针法 ;2. 合并+排序法
难度简单
熟练度✅✅✅✅✅

题目

给你两个按 非递减顺序 排列的整数数组 nums1 和 nums2,另有两个整数 m 和 n ,分别表示 nums1 和 nums2 中的元素数目。

请你 合并 nums2 到 nums1 中,使合并后的数组同样按 非递减顺序 排列。

  • 注意:最终,合并后数组不应由函数返回,而是存储在数组 nums1 中。为了应对这种情况,nums1 的初始长度为 m + n,其中前 m 个元素表示应合并的元素,后 n 个元素为 0 ,应忽略。nums2 的长度为 n 。

  • 示例 1:
    输入:nums1 = [1,2,3,0,0,0], m = 3, nums2 = [2,5,6], n = 3
    输出:[1,2,2,3,5,6]
    解释:需要合并 [1,2,3] 和 [2,5,6] 。 合并结果是 [1,2,2,3,5,6],其中斜体加粗标注的为 nums1 中的元素。

  • 示例 2:
    输入:nums1 = [1], m = 1, nums2 = [], n = 0
    输出:[1]
    解释:需要合并 [1] 和 [] 。 合并结果是 [1] 。

  • 示例 3:
    输入:nums1 = [0], m = 0, nums2 = [1], n = 1
    输出:[1]
    解释:需要合并的数组是 [] 和 [1] 。 合并结果是 [1] 。 注意,因为 m = 0 ,所以 nums1 中没有元素。nums1 中仅存的 0仅仅是为了确保合并结果可以顺利存放到 nums1 中。

  • 提示:
    nums1.length == m + n
    nums2.length == n
    0 <= m, n <= 200 1 <= m + n <= 200
    -109 <= nums1[i], nums2[j] <= 109

  • 进阶:你可以设计实现一个时间复杂度为 O(m + n) 的算法解决此问题吗?

题解

合并+排序法

  1. 核心要点:可以直接将nums2数组放到nums1数组后面,然后直接重新排序即可以完成非递减排序的新数组
  2. 时间复杂度:合并O(n);排序(快排)O((m+n)log(m+n))
  3. 空间复杂度:O(log(m+n))
  4. c++ 实现算法
class Solution {
public:void merge(vector<int>& nums1, int m, vector<int>& nums2, int n) {for(int i = 0; i < n; i++){nums1[m+i] = nums2[i];}sort(nums1.begin(), nums1.end());}
};

双指针

  1. 核心要点:考虑两个数组本身已经排序,可以利用双指针法p1、p2分别指向nums1、nums2数组索引,判定二者大小,小者放入新数组中即可。
  2. 时间复杂度:O(m+n)
  3. 空间复杂度:O(m+n)
  4. c++ 实现算法
class Solution2 {
public:void merge(vector<int>& nums1, int m, vector<int>& nums2, int n){int p1 = 0;int p2 = 0;int sorted[m+n];int cur;while(p1 < m || p2 < n){if(p1 == m){cur = nums2[p2++]; //nums1处理完,则处理nums2}else if(p2 == n){cur = nums1[p1++]; //nums2处理完,则处理nums1}//nums1和nums2都有元素,则比较二者大小else if(nums1[p1] < nums2[p2]){cur = nums1[p1++];}else {cur = nums2[p2++];}sorted[p1+p2-1] = cur;}for(int num = 0; num < m+n; num++){nums1[num] = sorted[num];}}
};
  1. 演示:以示例1为例
 推理:nums1[6] = {1, 2, 3, 0, 0, 0}nums2[3] = {2, 5, 6};m=6-3=3, n=3p1=0,p2=0, sorteed[6]第一次whilewhile(P1 < 3 || P2 <3)if(p1 == 3)/不成立else if(p2 == 3) //不成立else if(nums1[p1] < nums2[p2]) //1<2,成立cur = nums1[P1] /P1=0P1++else //不成立sorted[P1+P2-1] = sorted[1+0-1] = sorted[0] = cur = 1第二次while
while(P1 < 3 || P2 <3)if(p1 == 3)/不成立else if(p2 == 3) //不成立else if(nums1[p1] < nums2[p2]) //2<2,不成立else //成立cur = nums2[p2] //p2=0p2++sorted[P1+P2-1] = sorted[1+1-1] = sorted[1] = cur = 2第三次while
while(P1 < 3 || P2 <3)if(p1 == 3)/不成立else if(p2 == 3) //不成立else if(nums1[p1] < nums2[p2]) //2<5,成立cur = nums1[P1] /P1=1P1++else //不成立sorted[P1+P2-1] = sorted[2+1-1] = sorted[2] = cur = 2
以此类推。。。

完整demo

#include <iostream>
#include <vector>
#include <algorithm>using namespace std;//合并排序法
class Solution {
public:void merge(vector<int>& nums1, int m, vector<int>& nums2, int n) {for(int i = 0; i < n; i++){nums1[m+i] = nums2[i];}sort(nums1.begin(), nums1.end());}
};//双指针
class Solution2 {
public:void merge(vector<int>& nums1, int m, vector<int>& nums2, int n){int p1 = 0;int p2 = 0;int sorted[m+n];int cur;while(p1 < m || p2 < n){if(p1 == m){cur = nums2[p2++]; //nums1处理完,则处理nums2}else if(p2 == n){cur = nums1[p1++]; //nums2处理完,则处理nums1}//nums1和nums2都有元素,则比较二者大小else if(nums1[p1] < nums2[p2]){cur = nums1[p1++];}else {cur = nums2[p2++];}sorted[p1+p2-1] = cur;}for(int num = 0; num < m+n; num++){nums1[num] = sorted[num];}}
};
int main() {vector<int> nums1 = {1, 2, 3, 0, 0, 0};vector<int> nums2 = {2, 5, 6};int m = nums1.size() - 3;int n = nums2.size();Solution solution2;solution2.merge(nums1, m, nums2, n);cout << "Merged array: " << endl;for(int i = 0; i < nums1.size(); i++) {cout << "nums1[" << i << "]: " << nums1[i] << endl;}cout << endl;return 0;}

http://www.ppmy.cn/news/1558415.html

相关文章

SVM分类-支持向量机(Support Vector Machine)

SVM分类详细介绍 源码 什么是SVM分类&#xff1f; SVM分类&#xff08;支持向量机分类&#xff09;是一种基于**支持向量机&#xff08;Support Vector Machine, SVM&#xff09;**的监督学习算法&#xff0c;广泛应用于分类和回归分析。SVM通过在高维空间中寻找最佳分隔超平…

【OCR】数据集合集!

本文将为您介绍经典、热门的数据集&#xff0c;希望对您在选择适合的数据集时有所帮助。 1 RapidOCR 更新时间&#xff1a;2024-12-24 访问地址: GitHub 描述&#xff1a; 基于 ONNXRuntime、OpenVINO 和 PaddlePaddle 的超棒 OCR 多编程语言工具包。多平台、多语言 OCR 工具…

线性代数期末总复习的点点滴滴(1)

一、可逆矩阵、行列式、秩的关系 1.行列式与可逆矩阵的关系 所以&#xff0c;不难看出矩阵可逆的充分必要条件是该矩阵的行列式不为0。 2.接着来看&#xff0c;满秩和矩阵行列式的关系 不难看出满秩和行列式不为0是等价的。 3.再来看&#xff0c;满秩和矩阵可逆的关系 说明了…

Python实现将series系列数据格式批量转换为Excel

在Python中&#xff0c;如果你有一系列的数据&#xff08;假设是存储在列表或其他数据结构中的数据&#xff09;&#xff0c;想要批量转换为Excel格式&#xff0c;可以使用pandas库来实现。以下是一个简单的示例代码&#xff0c;假设你的数据是一个包含多个字典的列表&#xff…

EasyExcel停更,FastExcel接力

11月6日消息&#xff0c;阿里巴巴旗下的Java Excel工具库EasyExcel近日宣布&#xff0c;将停止更新&#xff0c;未来将逐步进入维护模式&#xff0c;将继续修复Bug&#xff0c;但不再主动新增功能。 EasyExcel以其快速、简洁和解决大文件内存溢出的能力而著称&#xff0c;官方…

医疗行业 UI 设计系列合集(一):精准定位

在当今数字化时代&#xff0c;医疗行业与信息技术的融合日益紧密&#xff0c;UI 设计在其中扮演着至关重要的角色。精准定位的 UI 设计能够显著提升医疗产品与服务的用户体验&#xff0c;进而对医疗效果和患者满意度产生积极影响。 一、医疗行业 UI 设计的重要性概述 医疗行业…

Kafka无锁设计

前言 在分布式消息队列系统中,Kafka 的无锁设计是其高吞吐量和高并发的核心优势之一。通过避免锁的竞争,Kafka 能够在高并发和大规模的生产环境中保持高效的性能。为了更好地理解 Kafka 的无锁设计,我们首先对比传统的队列模型,然后探讨 Kafka 如何通过无锁机制优化生产者…

Milvus矢量数据库 麒麟v10安装

什么是Milvus矢量数据库&#xff1f; Milvus 创建于 2019 年&#xff0c;其目标只有一个&#xff1a;存储、索引和管理由深度神经网络和其他机器学习 (ML) 模型生成的海量嵌入向量。 作为专门设计用于处理对输入向量的查询的数据库&#xff0c;它能够对一万亿级的向量进行索引…