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

C语言每日一题(22)合并两个有序数组

力扣网 88. 合并两个有序数组

题目描述

给你两个按 非递减顺序 排列的整数数组 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 中。

思路分析

方法1

时间复杂度  O(m+n)

空间复制度 O(m+n)

这是最基本的思路,将两个数组从头遍历,分别比较大小,较小的值先放到一个新创建的数组里,比较完后可能会存在剩余的情况,再将剩余的值放入新数组,题目要求返回数组1,再将新数组的内容拷贝进数组1里即可

void merge(int* nums1, int nums1Size, int m, int* nums2, int nums2Size, int n){int s1=0;int s2=0;int num3[200]={0};//新数组int i=0;while(s1<m&&s2<n)//任何一个数组遍历完结束循环{if(nums1[s1]<nums2[s2])//较小值先放{num3[i++]=nums1[s1++];}else if(nums1[s1]==nums2[s2])//相等则一起放,任意规则{num3[i++]=nums1[s1++];num3[i++]=nums2[s2++];}else{num3[i++]=nums2[s2++];}}if(s1==m)//s1遍历完的情况下,s2还没有遍历完的情况下{while(s2<n){num3[i++]=nums2[s2++];}}if(s2==n)//s2遍历完的情况下,s1还没有遍历完{while(s1<m){num3[i++]=nums1[s1++];}}for(int j=0;j<nums1Size;j++)//将新数组拷贝到数组1里{nums1[j]=num3[j];}}

方法2

时间复杂度  O(m+n)

空间复杂度  O(1)

思路:从两个数组的末尾开始遍历,数组1从最后一个数开始向前遍历,较大值放到数组1的末尾,如果遍历完数组2还有剩余的话直接放入。

void merge(int* nums1, int nums1Size, int m, int* nums2, int nums2Size, int n){int s1=m-1;//数组1的末尾(最后一个数字)int s2=n-1;//数组2的末尾int index=m+n-1;//(数组1的末尾)while(s1>=0&&s2>=0){if(nums1[s1]>nums2[s2]){nums1[index--]=nums1[s1--];}else{nums1[index--]=nums2[s2--];}}while(s2>=0)//数组2还有剩余的情况{nums1[index--]=nums2[s2--];}}

 

http://www.lryc.cn/news/211472.html

相关文章:

  • C++学习day--24 推箱子游戏图像化开发
  • YOLOv8中的After Fuse指的是什么?
  • R-FCN: Object Detection via Region-based Fully Convolutional Networks(2016.6)
  • Linux服务器部署Spring Boot项目的一些shell命令脚本
  • Youtube DNN:Deep Neural Networks for YouTube Recommendations
  • Python 入门基础知识点有哪些?
  • 【每日一题】补档 CF487B. Strip | 数据结构杂烩 -> 单调队列 | 困难
  • 向量数据库和普通关系型数据库的区别,LAXCUS支持哪种数据库?
  • 操作系统 --- 存储器管理
  • Python selenium无界面headless
  • JavaScript 中的负无穷大是什么?
  • 2023年十大地推和网推拉新app推广接单平台,一手单渠道
  • mybatis-plus的进阶使用
  • centos安装vim编辑器
  • PostgreSQL InvalidMessage Cache 同步机制
  • C#,数值计算——Globals的计算方法与源程序
  • 腾讯云香港服务器轻量24元一个月性能测试
  • 深度学习之基于YoloV8的行人跌倒目标检测系统
  • Seata入门系列【16】XA模式入门案例
  • 高级深入--day44
  • Apache Doris (四十八): Doris表结构变更-替换表
  • 消息认证码--数字签名--证书
  • 四个制作PPT的小技巧
  • Echarts饼状图grid设置
  • 系列三、Spring IOC
  • electron汇总
  • 电脑怎么共享屏幕?电脑屏幕共享软件分享!
  • 全新一代数字内容体验云平台
  • 目标检测理论知识
  • 聚观早报 |蔚来推出婚车服务;长城汽车第三季度财报