当前位置: 首页 > news >正文

leetcode88.合并两个有序数组

目录

  • 问题描述
  • 示例
    • 提示
  • 具体思路
    • 思路一
    • 思路二
  • 代码实现

问题描述

给你两个按 非递减顺序 排列的整数数组 nums1 和 nums2,另有两个整数 m 和 n ,分别表示 nums1 和 nums2 中的元素数目。
请你 合并 nums2 到 nums1 中,使合并后的数组同样按 非递减顺序 排列。
注意:最终,合并后数组不应由函数返回,而是存储在数组 nums1 中。为了应对这种情况,nums1 的初始长度为 m + n,其中前 m 个元素表示应合并的元素,后 n 个元素为 0 ,应忽略。nums2 的长度为 n 。

题目链接:合并两个有序数组

示例

在这里插入图片描述

在这里插入图片描述
在这里插入图片描述

提示

  nums1.length == m + n
   nums2.length == n
  0 <= m, n <= 200
  1 <= m + n <= 200
  - 1 0 9 10^9 109 <= nums1[i], nums2[j] <= 1 0 9 10^9 109

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

具体思路

思路一

  重新额外开辟一个数组存放合并后的值。那么这样的空间复杂度就比较大,还有一种就是将数组2的内容先放到数组1中,然后使用qsort进行排序,这中方法的时间复杂度就比较高了

思路二

  不需要额外开数组的方法。在数组1中使用end1指针,数组2中使用end2t指针,两个数组从后往前进行比较,将比较后数组中较小的数进行尾插(放到数组1的最后面),当数组1先结束的时候,需要将数组2中的数依次全部拷贝到数组1中,当数组2先结束的时候,就不需要进行拷贝
在这里插入图片描述

代码实现

//思路2
void merge(int* nums1, int nums1Size, int m, int* nums2, int nums2Size, int n) {
    int end1 = m-1;
    int end2 = n-1;
    int i = m+n-1;
    while(end1 >= 0 && end2 >= 0)
    {
        if(nums1[end1]>nums2[end2])
        {
            nums1[i--] = nums1[end1--];
        }
        else
        {
            nums1[i--] = nums2[end2--];
        }
    }

    while(end2>=0)
    {
         nums1[i--] = nums2[end2--];
    }
}

相关文章:

  • springboot021-基于协同过滤算法的个性化音乐推荐系统
  • Java并发编程——锁升级机制
  • SSE:用于流式传输的协议
  • 百度热力图数据获取,原理,处理及论文应用6
  • Java 开发者需要了解的 PDF 基础知识
  • 安全防御综合练习2 nat+智能选路
  • 串的基本操作--数据结构
  • 算法日常刷题笔记(1)
  • 【数据分享】1929-2024年全球站点的逐日降雪深度数据(Shp\Excel\免费获取)
  • vLLM专题(二):安装-CPU
  • Retrofit+OkHttp+ViewModel
  • Go入门之语言变量 常量介绍
  • MongoDB 7 分片副本集升级方案详解(上)
  • CentOS 8 配置bond
  • C# 入门简介
  • Flutter 中的数据跨层传递方案
  • Qt之线程的创建与启动
  • 【JAVA工程师从0开始学AI】,第四步:闭包与高阶函数——用Python的“魔法函数“重构Java思维
  • 深入理解同步与异步I/O:从原理到实战
  • vue 判断字符串开头是http或者https
  • 坐标大零号湾科创策源区,上海瑞金医院闵行院区正式启动建设
  • 上海位居全球40城科技传播能力第六名
  • 博物馆书单|走进博物馆,去体验一场与文明的对话
  • 江西4人拟任县(市、区)委书记,其中一人为“80后”
  • 一条铺过11年时光的科学红毯,丈量上海科创的“长宽高”
  • 浙江演艺集团7部作品组团来沪,今夏开启首届上海演出季