leetcode刷题(32)——88. 合并两个有序数组
给定两个有序整数数组 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. 合并两个有序数组相关推荐
- LeetCode刷题Java——88.合并两个有序数组(简单)
题目 给你两个按非递减顺序排列的整数数组nums1和nums2,另有两个整数m和n,分别表示nums1和nums2中的元素数目. 请你合并nums2到nums1中,使合并后的数组同样按非递减顺序排列. ...
- C#LeetCode刷题之#88-合并两个有序数组(Merge Sorted Array)
问题 该文章的最新版本已迁移至个人博客[比特飞],单击链接 https://www.byteflying.com/archives/3686 访问. 给定两个有序整数数组 nums1 和 nums2, ...
- LeetCode每日一练 —— 88. 合并两个有序数组
- LeetCode 88. 合并两个有序数组 golang
88. 合并两个有序数组 给你两个有序整数数组 nums1 和 nums2,请你将 nums2 合并到 nums1 中,使 nums1 成为一个有序数组. 说明: 初始化 nums1 和 nums2 ...
- Java实现 LeetCode 88 合并两个有序数组
88. 合并两个有序数组 给定两个有序整数数组 nums1 和 nums2,将 nums2 合并到 nums1 中,使得 num1 成为一个有序数组. 说明: 初始化 nums1 和 nums2 的元 ...
- leetcode 88. 合并两个有序数组
88. 合并两个有序数组 class Solution {public:void merge(vector<int>& nums1, int m, vector<int> ...
- LeetCode-双指针-88. 合并两个有序数组
88. 合并两个有序数组 思路:归并排序,一长一短,肯定会有一个先放完,放完后把另一个拷贝过去即可. 为了避免覆盖所以从最后开始向前放最大的元素 class Solution {public:void ...
- 双指针:88. 合并两个有序数组
题目链接 88. 合并两个有序数组 解题思路 一. 合并数组后排序,时间复杂度为O((n+m)log(n+m)) 代码: 快排详解 class Solution {public void merge( ...
- 88. 合并两个有序数组 golang
88. 合并两个有序数组 给你两个有序整数数组 nums1 和 nums2,请你将 nums2 合并到 nums1 中,使 nums1 成为一个有序数组. 说明: 初始化 nums1 和 nums2 ...
- (数组)88. 合并两个有序数组(java)
1.题目描述: 2.实例: 3.分析: 感觉过于简单,都不好意思发出来,但作为记录一步步走来,还是分析分析 非递减就是递增嘛 递增总没错 而且人家数组提供有方法直接用嘛 我的做法就是把第二个数组的值 ...
最新文章
- BigDecimal源码解析
- 轻量级日志采集系统Loki+grafana搭建
- Web通用令牌JwtBuilder
- 计算机中有关数及编码的知识,计算机中有关数及编码的知识
- 输入圆的半径,计算并输出圆的周长和面积
- 从零单排HBase 02:全面认识HBase架构(建议收藏)
- Java高并发编程详解系列-线程安全数据同步
- CentOS下DB2数据库安装过程详解
- Android Fragment之间的跳转
- Java多线程系列--“JUC线程池”01之 线程池架构
- vscode常用emmet语法及快捷键
- ES6 将数组根据某个属性进行分组的方法
- Java项目:Springboot图书馆图书借阅管理系统
- thrift 编译报错 undefined reference
- (八)高德地图之添加marker标记点
- 基于锁的并发数据结构:如何给数据结构加锁?
- python登录接口并发测试_使用python脚本作接口并发测试
- ARM M3综合细节描述:
- 微信账单动态吸顶功能实现逻辑
- 出栈顺序(栈和队列)B
热门文章
- python入门到精通,一篇就够。40个python游戏经典开源项目(开源分享:俄罗斯方块、魂斗罗、植物大战僵尸、飞机大战、超级玛丽...)
- 全能电子地图下载器——MapTileDownloader
- java拦截器和过滤器的区别_拦截器和过滤器的区别
- 【目标检测】(12) 非极大值抑制 NMS 和 Soft-NMS,附TensorFlow完整代码
- matlab z变换离散化_Matlab基础教程
- Linux基础入门(详细版)
- Docker搭建Nginx集群
- Duet Display在PC端无法连接怎么办?
- 用Python怎样实现Excel中的公式向下填充?
- gazebo 模型导入