2.合并两个有序数组

  • 题目描述
  • 解题思路
  • 代码

题目描述

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

解题思路

解法一:双指针法
思路:
时间复杂度:O(n)
空间复杂度:O(m+n)=O(n)
解法二:直接合并后排序法
思路:直接将两个数组合并,然后再对合并后的数组进行排序
时间复杂度:平均情况O((m+n)log(m+n))
空间复杂度:平均情况O(log(m+n))
解法三:逆向双指针法
思路:从后往前对两个数组进行遍历比较,然后将较大的嵌入的nums1的后面
时间复杂度:O(m+n)
空间复杂度:O(l)

代码

解法一:双指针法(写的点冗余)

   public static void merge(int[] nums1, int m, int[] nums2, int n) {int[] arr=new int[m+n];int i=0;int j=0;int r=0;if(m!=0 && n!=0){while(i<m && j<n){if((nums1[i]<=nums2[j])){arr[r]=nums1[i];r++;i++;}else{arr[r]=nums2[j];r++;j++;}}if(i<m){for(;i<m;i++)arr[r++]=nums1[i];}if(j<n){for (;j<n;j++)arr[r++]=nums2[j];}for(int x=0;x<m+n;x++){nums1[x]=arr[x];}}else if (m==0 && n!=0){for (int c=0;c<n;c++)nums1[c]=nums2[c];}else{}}

解法二:直接合并后排序法

    public static void merge2(int[] nums1, int m, int[] nums2, int n) {for(int i=0;i<n;i++)nums1[m+i]=nums2[i];Arrays.sort(nums1);}

解法三:逆向双指针法

    public static void merge3(int[] nums1, int m, 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;}}

来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/merge-sorted-array

2. 合并两个有序数组相关推荐

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

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

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

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

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

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

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

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

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

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

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

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

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

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

  8. 88. 合并两个有序数组 golang

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

  9. 中数组的合并_【美团面试题】合并两个有序数组

    [美团面试题]合并两个有序数组 题目描述 给你两个有序整数数组 nums1 和 nums2,请你将 nums2 合并到 nums1 中,使 nums1 成为一个有序数组 划重点 初始化 nums1 和 ...

  10. LeetCode--88.合并两个有序数组(插入法,排序法)

    合并两个有序数组(C, Python) 1. 题目描述 2. 题目分析 3. C语言实现 4. Python语言实现 1. 题目描述 难度:简单 2. 题目分析 这道题比较简单,实现方法有两种: 插入 ...

最新文章

  1. python实现选择排序
  2. 输入法大战,你用哪家输入法? | 每日趣闻
  3. 基础005_V7-Select IO
  4. Vue 中computed 与 methods 区别
  5. 查询Oracle正在执行的sql语句
  6. Win7,Win8下多实例运行Excel2010
  7. 对int array进行排序
  8. 数字电路技术可能出现的简答题_2013年9月份考试数字电子技术第二次作业
  9. 4-8 :button表单按钮选择器
  10. c语言将两个文件合成一个,keil中怎么把两个c程序怎么同时同时编译生成一个hex文件...
  11. C#高性能大容量SOCKET并发完成端口例子(有C#客户端)完整实例源码
  12. transform改变图片大小以及位置
  13. 手机测试人员的思维过程
  14. 苹果脚本入门指南 第一章-苹果编程语言介绍和编程软件打开方法及界面介绍
  15. Rademacher复杂度和VC-维
  16. 语音交友app开发中的用户积分系统
  17. 什么是session
  18. 速腾聚创激光雷达部署
  19. TCP长连接与短连接、心跳机制
  20. 小程序css样式变量/api promise化

热门文章

  1. nexus3安装配置
  2. 2015蓝桥杯python——奇妙的数字
  3. win8 万能驱动 32位,64位最新版 显卡驱动 网卡驱动 装机必备
  4. 2011 明锐 CD 大众收音机 播放SD 卡顿问题
  5. 有照片换发型的软件吗?看完这篇文章就知道了
  6. Linux系统中的DDNS(花生壳)
  7. 压缩文件格式未知或者数据已经被损坏    的解决方案
  8. android8.1.0官方下载,官方Xposed框架For Android8.0/8.1(Oreo)发布v90-beta3版本
  9. echarts 调整图表大小的方法
  10. 《分析一波NBA今年季后赛之狂野西部》程序员不好好写代码,聊上篮球了!