class Solution {
public:void merge(vector<int>& nums1, int m, vector<int>& nums2, int n) {int p1 =0,p2=0;int sorted[m+n];//声明一个m+n大小的数组int  cur;while (p1<m||p2<n){if(p1==m){//先判断边界条件cur=nums2[p2++];}else if(p2==n){cur=nums1[p1++];}else if(nums1[p1]<nums2[p2]){cur=nums2[p2++];}else if (nums1[p1]>nums2[p2]){cur=nums2[p2++];}else {cur=nums2[p2++];}sorted[p1+p2-1]=cur;}for(int i=0;i!=m+n;++i){nums1[i]=sorted[i];//将整理好的sorted数组覆盖nums1}}
};

首先设置两个整形变量p1、p2,然后声明一个暂时用于存放排序的数组sorted[m+n],中间变量cur

当数组下标p1、p2大于自己所指向的数组时退出循环;

循环首先判断边界条件;之后判断两个数组的大小,将小的数组的值存放到中间数组sorted;当一个数组都存放完毕后,就只存放另一个数组了

最后将中间数组sorted复制到数组一nums1中去

复杂度分析

时间复杂度:O((m+n)\log(m+n))O((m+n)log(m+n))。
排序序列长度为 m+nm+n,套用快速排序的时间复杂度即可,平均情况为 O((m+n)\log(m+n))O((m+n)log(m+n))。

空间复杂度:O(\log(m+n))O(log(m+n))。
排序序列长度为 m+nm+n,套用快速排序的空间复杂度即可,平均情况为 O(\log(m+n))O(log(m+n))。


class Solution {
public:void merge(vector<int>& nums1, int m, vector<int>& nums2, int n) {int p1=m-1,p2=n-1;int tail=m+n-1;//用于指向第一个数组尾部int cur;while (p1>=0||p2>=0){if(p1==-1){//边界条件判断cur=nums2[p2--];}else if(p2==-1){cur=nums1[p1--];}else if(nums1[p1]>nums2[p2]){cur=nums1[p1--];}else{cur=nums2[p2--];}nums1[tail--]=cur;}}
};

尾指针法

将数组一和数组二的数据从数据最后进行判断,大的存放到数组一的尾部,同时指向尾部的存放数据的两个指针/数据下标左移

思考 为什么是尾指针法?

如果是头指针法将小的数据存放到数组一中的第一个位置有可能会覆盖数组一中的原有数据,而尾指针插入法前n个数据插入的地方是没有数据的,不会造成数据 的覆盖。

复杂度分析

时间复杂度:O(m+n)O(m+n)。
指针移动单调递减,最多移动 m+nm+n 次,因此时间复杂度为 O(m+n)O(m+n)。

空间复杂度:O(1)O(1)。
直接对数组 nums 1
原地修改,不需要额外空间。

合并两个有序数组-双指针法相关推荐

  1. 如何快速合并两个有序数组?

    前言 大家好,我是来自于「华为」的「程序员小熊」.今天给大家带来一道与「数组」相关的题目,这道题同时也是字节.微软和亚马逊等互联网大厂的面试题,即力扣上的第 88 题-合并两个有序数组. 本文主要介绍 ...

  2. 2. 合并两个有序数组

    2.合并两个有序数组 题目描述 解题思路 代码 题目描述 给你两个按 非递减顺序 排列的整数数组 nums1 和 nums2,另有两个整数 m 和 n ,分别表示 nums1 和 nums2 中的元素 ...

  3. 数组-合并两个有序数组(双指针,从后往前)

    题意: 给你两个有序整数数组 nums1 和 nums2,请你将 nums2 合并到 nums1 中,使 nums1 成为一个有序数组. 说明: 初始化 nums1 和 nums2 的元素数量分别为 ...

  4. LeetCode-双指针-88. 合并两个有序数组

    88. 合并两个有序数组 思路:归并排序,一长一短,肯定会有一个先放完,放完后把另一个拷贝过去即可. 为了避免覆盖所以从最后开始向前放最大的元素 class Solution {public:void ...

  5. LeetCode 88合并两个有序数组89格雷编码

    微信搜一搜:bigsai 专注于Java.数据结构与算法,一起进大厂不迷路! 算法文章题解全部收录在github仓库bigsai-algorithm,求star! 关注回复进群即可加入力扣打卡群,欢迎 ...

  6. 合并两个无序数组java_88. 合并两个有序数组

    88. 合并两个有序数组 给你两个有序整数数组 nums1 和 nums2,请你将 nums2 合并到 nums1 中,使 nums1 成为一个有序数组. 说明: 初始化 nums1 和 nums2的 ...

  7. 合并两个有序数组(双/三指针)

    今天写作业,合并两个有序数组a和b,时间复杂度要求O(n),空间复杂度要求O(1). 很快想到创建第三个数组c,用双指针初始化指向a和b的头元素,每次选择较大者在c上尾插进去之后,再后移相对应a或者b ...

  8. 双指针:88. 合并两个有序数组

    题目链接 88. 合并两个有序数组 解题思路 一. 合并数组后排序,时间复杂度为O((n+m)log(n+m)) 代码: 快排详解 class Solution {public void merge( ...

  9. LeetCode 88. 合并两个有序数组 golang

    88. 合并两个有序数组 给你两个有序整数数组 nums1 和 nums2,请你将 nums2 合并到 nums1 中,使 nums1 成为一个有序数组. 说明: 初始化 nums1 和 nums2 ...

最新文章

  1. 2月中国域名总量平稳回升 净增长量逾10.3万个
  2. python 内置模块:collections
  3. SQL Server Profiler (SQL跟踪器)的简单使用
  4. hdu4266(三维凸包模板题)
  5. Winforn中导入Excel并显示然后获取多选框选中的内容
  6. 大数据量Excel Import导致OOM问题
  7. jboss使用_使用JBoss Cool Store的终极云零售指南
  8. fopen php 乱码,如何解决php fgets读取文件乱码的问题
  9. PAT——1074. 宇宙无敌加法器(20)
  10. IDEA java 显示build目录
  11. TensorFlow2.0 学习笔记(四):迁移学习(MobileNetV2)
  12. 卷帘快门(Rolling Shutter)与全局快门(Global Shutter)的区别
  13. ajax请求数据 ztree_ztree通过ajax获取json并勾选checkbook
  14. pandas计算对数收益率
  15. Pytorch 模型 查看网络参数的梯度以及参数更新是否正确,优化器学习率设置固定的学习率,分层设置学习率
  16. 算法笔记(七)扩大感受野SPP/ASPP/RBF
  17. linux中数据库的管理
  18. 如何删除联想lenovo硬盘的隐藏分区
  19. 那些年我用过的JSON格式化工具
  20. 尝试搭建本地语音转文字系统[1]

热门文章

  1. 大学物理实验长度的测量实验报告_大学物理实验报告长度测量.doc
  2. 高亮word特定关键字(python)
  3. 狂神JavaScript快速入门学习笔记
  4. javaweb实习实训管理系统mysql
  5. Oracle Instant Client Downloads
  6. MyBatis08:ResultMap 的结果集映射
  7. Hadoop2.6.0运行mapreduce之Uber模式验证
  8. python集合例题_python 学到集合为止的17道练习题
  9. matlab实现人口阻滞增长模型的代码
  10. 算法导论第16章练习题 16.1-4