给定两个有序整数数组 nums1 和 nums2,将 nums2 合并到 nums1 中,使得 num1 成为一个有序数组。

说明:
初始化 nums1 和 nums2 的元素数量分别为 m 和 n。
你可以假设 nums1 有足够的空间(空间大小大于或等于 m + n)来保存 nums2 中的元素。

示例:

输入:
nums1 = [1,2,3,0,0,0], m = 3
nums2 = [2,5,6],       n = 3输出: [1,2,2,3,5,6]

方法1:
投机取巧,感觉面试并不会喜欢这种解法,直接两个合并为一个数组,然后用Api进行排序,但此方法没有利用到两个数组都是分别已经排序好的特点。

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

方法2:双指针 / 从前往后
一般而言,对于有序数组可以通过 双指针法 达到O(n + m)O(n+m)的时间复杂度。

最直接的算法实现是将指针p1 置为 nums1的开头, p2为 nums2的开头,在每一步将最小值放入输出数组中。

由于 nums1 是用于输出的数组,需要将nums1中的前m个元素放在其他地方,也就需要 O(m)O(m) 的空间复杂度。

class Solution {public void merge(int[] nums1, int m, int[] nums2, int n) {// Make a copy of nums1.int [] nums1_copy = new int[m];System.arraycopy(nums1, 0, nums1_copy, 0, m);// Two get pointers for nums1_copy and nums2.int p1 = 0;int p2 = 0;// Set pointer for nums1int p = 0;// Compare elements from nums1_copy and nums2// and add the smallest one into nums1.while ((p1 < m) && (p2 < n))nums1[p++] = (nums1_copy[p1] < nums2[p2]) ? nums1_copy[p1++] : nums2[p2++];// if there are still elements to addif (p1 < m)System.arraycopy(nums1_copy, p1, nums1, p1 + p2, m + n - p1 - p2);if (p2 < n)System.arraycopy(nums2, p2, nums1, p1 + p2, m + n - p1 - p2);}
}

复杂度分析
时间复杂度 : O(n + m)。
空间复杂度 : O(m)。

方法3 : 双指针 / 从后往前
标签:从后向前数组遍历
1.因为 nums1 的空间都集中在后面,所以从后向前处理排序的数据会更好,节省空间,一边遍历一边将值填充进去
2.设置指针 len1 和 len2 分别指向 nums1 和 nums2 的有数字尾部,从尾部值开始比较遍历,同时设置指针 len 指向 nums1 的最末尾,每次遍历比较值大小之后,则进行填充
3.当 len1<0 时遍历结束,此时 nums2 中还有数据未拷贝完全,将其直接拷贝到 nums1 的前面,最后得到结果数组
时间复杂度:O(m+n)

巧妙之处在于while ((p1 >= 0) && (p2 >= 0))采用了&符号,当跳出循环时候必然是nums1已经遍历完毕,此时直接拷贝nums2剩余的数,如果p2还大于0的话

class Solution {public void merge(int[] nums1, int m, int[] nums2, int n) {// two get pointers for nums1 and nums2int p1 = m - 1;int p2 = n - 1;// set pointer for nums1int p = m + n - 1;// while there are still elements to comparewhile ((p1 >= 0) & (p2 >= 0))// compare two elements from nums1 and nums2 // and add the largest one in nums1 nums1[p--] = (nums1[p1] < nums2[p2]) ? nums2[p2--] : nums1[p1--];// add missing elements from nums2System.arraycopy(nums2, 0, nums1, 0, p2 + 1);}
}

leetcode刷题(32)——88. 合并两个有序数组相关推荐

  1. LeetCode刷题Java——88.合并两个有序数组(简单)

    题目 给你两个按非递减顺序排列的整数数组nums1和nums2,另有两个整数m和n,分别表示nums1和nums2中的元素数目. 请你合并nums2到nums1中,使合并后的数组同样按非递减顺序排列. ...

  2. C#LeetCode刷题之#88-合并两个有序数组(Merge Sorted Array)

    问题 该文章的最新版本已迁移至个人博客[比特飞],单击链接 https://www.byteflying.com/archives/3686 访问. 给定两个有序整数数组 nums1 和 nums2, ...

  3. LeetCode每日一练 —— 88. 合并两个有序数组

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

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

  5. Java实现 LeetCode 88 合并两个有序数组

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

  6. leetcode 88. 合并两个有序数组

    88. 合并两个有序数组 class Solution {public:void merge(vector<int>& nums1, int m, vector<int> ...

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

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

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

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

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

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

  10. (数组)88. 合并两个有序数组(java)

    1.题目描述: 2.实例: 3.分析: 感觉过于简单,都不好意思发出来,但作为记录一步步走来,还是分析分析 非递减就是递增嘛 递增总没错  而且人家数组提供有方法直接用嘛 我的做法就是把第二个数组的值 ...

最新文章

  1. BigDecimal源码解析
  2. 轻量级日志采集系统Loki+grafana搭建
  3. Web通用令牌JwtBuilder
  4. 计算机中有关数及编码的知识,计算机中有关数及编码的知识
  5. 输入圆的半径,计算并输出圆的周长和面积
  6. 从零单排HBase 02:全面认识HBase架构(建议收藏)
  7. Java高并发编程详解系列-线程安全数据同步
  8. CentOS下DB2数据库安装过程详解
  9. Android Fragment之间的跳转
  10. Java多线程系列--“JUC线程池”01之 线程池架构
  11. vscode常用emmet语法及快捷键
  12. ES6 将数组根据某个属性进行分组的方法
  13. Java项目:Springboot图书馆图书借阅管理系统
  14. thrift 编译报错 undefined reference
  15. (八)高德地图之添加marker标记点
  16. 基于锁的并发数据结构:如何给数据结构加锁?
  17. python登录接口并发测试_使用python脚本作接口并发测试
  18. ARM M3综合细节描述:
  19. 微信账单动态吸顶功能实现逻辑
  20. 出栈顺序(栈和队列)B

热门文章

  1. python入门到精通,一篇就够。40个python游戏经典开源项目(开源分享:俄罗斯方块、魂斗罗、植物大战僵尸、飞机大战、超级玛丽...)
  2. 全能电子地图下载器——MapTileDownloader
  3. java拦截器和过滤器的区别_拦截器和过滤器的区别
  4. 【目标检测】(12) 非极大值抑制 NMS 和 Soft-NMS,附TensorFlow完整代码
  5. matlab z变换离散化_Matlab基础教程
  6. Linux基础入门(详细版)
  7. Docker搭建Nginx集群
  8. Duet Display在PC端无法连接怎么办?
  9. 用Python怎样实现Excel中的公式向下填充?
  10. gazebo 模型导入