leetcode面试题 10.01. 合并排序的数组
直接排序
直接使用Java已有的方法进行排序,这一招…大意了!
这题简单,就是个基本的排序,后面难题,可能这只是一小步,内个时候直接用排序算法比较合适,这个不合适。。
class Solution {public void merge(int[] A, int m, int[] B, int n) {for(int i = 0; i < n; i++){A[m+i] = B[i];}Arrays.sort(A);}
}
我们看看方法
这是一个更优的快速排序算法,对于某些数据,传统的快速排序可能会退化为二次方的事件复杂度,而此算法会更快一些,是O(n log(n))。
这种方式,顶多算应用黑箱子,没啥可以说的…
双指针 + 临时数组
我们可以对每个数组都添加一个索引指针,依次对比两个数组的值,让最小的进入临时数组,比较之后,把剩余的数直接放入临时数组,最后,临时数组再赋值给A。
leetcode的动图很好,直接放出来链接。
双指针
class Solution {public void merge(int[] A, int m, int[] B, int n) {int[] temp = new int[m+n];int i = 0; // array A pointerint j = 0; // array B pointerint k = 0; // array temp pointerwhile(i < m && j < n){if(A[i] < B[j]){temp[k++] = A[i++];} else if(A[i] >= B[j]){temp[k++] = B[j++];} }// 剩余部分while(i < m){temp[k++] = A[i++];}while(j < n){temp[k++] = B[j++];}k = 0;i = 0;while(k < m + n){A[i++] = temp[k++];}}
}
这种方法,实现起来很简单,其实就是依次比较,但是开辟新的数组,再放回去,就很麻烦。
同样的思路,不同的实现方式
对于同样的逻辑,代码写起来其实也不一定一样的!我们看一看!
逆向双指针
所以,我们尝试一下在数组A直接动手脚,利用数组A中后半部分的剩余空间,看看可不可行!
关键点:A中的元素会不会被覆盖
我们可以,从两数组的后面开始,比较谁大,将大的放进A的最后面。
这里,我们列举极端例子
- B中的元素,全部比A中最大的还大
那么,B中的元素全部放入A的剩余空间中去,显然,没有问题!
2. B的元素,比A的元素都小
当然也能放进去。
最后,我们看看中间状态,也就是正常状态
很容易分析得出,不管怎么样,A中的剩余空间一定够用!
因此写代码实现:
class Solution {// 逆向双指针public void merge(int[] A, int m, int[] B, int n) {int ap = m - 1;int bp = n - 1;int final_pointer = m + n - 1;while(ap >= 0 && bp >= 0){if(A[ap] > B[bp]){A[final_pointer--] = A[ap--];} else{A[final_pointer--] = B[bp--];}}// 若A剩余,就不用管了;若B剩余,都扔进去while(bp >= 0){A[final_pointer--] = B[bp--];}}
}
或者可以
class Solution {// 逆向双指针public void merge(int[] A, int m, int[] B, int n) {int ap = m - 1;int bp = n - 1;int final_pointer = m + n - 1;while(bp >= 0){// 置换A的元素if(ap >= 0 && A[ap] > B[bp]){ // 注意顺序不要写反!A[final_pointer--] = A[ap--];} else {// 置换B的元素A[final_pointer--] = B[bp--];}}}
}
后者写法简洁一些,前者写法更加明了,是继承解法二的思想。
我们用严格的方式再说明一下A不会被覆盖的问题。
我们只需要满足
- A中可用的位置 >= (A已经置换的数量 + B已经置换的数量)
因此,我们分别表示一下
我们要求的是白格子的数量,是
- n - (pb + 1) =
n - pb - 1
- pb是索引,从0开始,因此,橙色一共
pb + 1
个,总数是n
,减一下就行了
A同理
m - pa - 1
当前数组A可插入数量应该是m + n - pa - 1
。
我们求的这三个数分别是(在同一时刻)
- f1:A扔到A后面去的
- f2:B扔到A后面去的
- f3:A后面总共可以插入的元素(不被覆盖的情况下)
我们只需要验证f3 >= f1 + f2
恒成立即可!
=> pa >= -1
显然恒成立。
leetcode面试题 10.01. 合并排序的数组相关推荐
- Leetcode面试题 10.01. 合并排序的数组(C语言)
Leetcode面试题 10.01. 合并排序的数组(C语言) 题目: 给定两个排序后的数组 A 和 B,其中 A 的末端有足够的缓冲空间容纳 B. 编写一个方法,将 B 合并入 A 并排序.初始化 ...
- Leetcode 面试题 10.01. 合并排序的数组 (每日一题 20210616)
给定两个排序后的数组 A 和 B,其中 A 的末端有足够的缓冲空间容纳 B. 编写一个方法,将 B 合并入 A 并排序.初始化 A 和 B 的元素数量分别为 m 和 n.示例:输入: A = [1,2 ...
- 2022-4-1 Leetcode 面试题10.01合并排序的数组
第一版,使用库函数 class Solution {public:void merge(vector<int>& A, int m, vector<int>& ...
- 面试题 10.01. 合并排序的数组
面试题 10.01. 合并排序的数组 思路:①把B数组放在A数组后面,然后排序.O((n+m)²),太蠢了代码不写 ②copyA数组,然后两个指针判度copyA,和B的值那个小,小的放在A数组中,然后 ...
- 程序员面试金典 - 面试题 10.01. 合并排序的数组
1. 题目 给定两个排序后的数组 A 和 B,其中 A 的末端有足够的缓冲空间容纳 B. 编写一个方法,将 B 合并入 A 并排序. 初始化 A 和 B 的元素数量分别为 m 和 n. 示例: 输入: ...
- python【力扣LeetCode算法题库】面试题 10.01-合并排序的数组
面试题 10.01. 合并排序的数组 给定两个排序后的数组 A 和 B,其中 A 的末端有足够的缓冲空间容纳 B. 编写一个方法,将 B 合并入 A 并排序. 初始化 A 和 B 的元素数量分别为 m ...
- Leetcode 面试题 08.01. 三步问题
Leetcode 面试题 08.01. 三步问题 1.问题分析 2.问题解决 3.总结 1.问题分析 题目链接:https://leetcode-cn.com/problems/three-steps ...
- python 合并排序的数组
| 合并排序的数组 给定两个排序后的数组 A 和 B,其中 A 的末端有足够的缓冲空间容纳 B. 编写一个方法,将 B 合并入 A 并排序. 初始化 A 和 B 的元素数量分别为 m 和 n. 示例: ...
- LeetCode 面试题 10.02. 变位词组
面试题 10.02. 变位词组 Ideas 互为变位词的两个字符串包含的字符相同,因此对两个字符串分别进行排序之后得到的字符串一定是相同的,可以将排序之后的字符串作为哈希表的键. 在Python里面有 ...
最新文章
- GIT入门笔记(4)- GIT 安装
- Python之pandas:数据类型变换之object、category、bool、int32、int64、float64以及数据类型标准化之详细攻略
- yii urlmanager配置post不生效_一文带你彻底学会 Git Hooks 配置
- pandas打印全部列_python——pandas练习题1-5
- Jquery 日期组件
- SEO中HTML标签权重列表
- 行业最大!黑鲨5系列将搭载5320mm²双VC散热:冰封骁龙8
- 学生电脑哪个牌子好_香米哪个牌子好
- php 自定义 引用函数,php总结6——自定义函数、引用传值
- c语言system.h头文件下载,c语言头文件大全
- IOS学习之Segue
- 计算机专业应届生简历英语作文,计算机专业毕业生英文简历范文
- sqlserver导入sql文件的方式
- 计算机用户账户类型有哪些,2010年职称计算机考试:用户账户类型
- I Incoming Asteroids(优先队列)
- R语言Outliers异常值检测方法比较
- 推荐 6 个火爆 GitHub 的开源项目
- VUE+WebPack游戏设计:欲望都市城市图层的设计
- 注销Apple ID账号
- mysql解决Access denied for user ''@'localhost' to database 'mysql'没有mysql库
热门文章
- 洛谷P1757 通天之分组背包 [2017年4月计划 动态规划06]
- css cursor url用法格式详解
- 好消息,关于2005的default provider
- mysql jion 实现原理_MySQL-join的实现原理、优化及NLJ算法
- 大数据胸_喂母乳会导致胸下垂?!你被这个谣言骗了多少年?
- matlab提取艾里斑,艾里斑:我不是雀斑
- qq五笔linux,QQ五笔 - 五笔小字典 QQ绑定很实用
- 二维有限体积 matlab,二维有限体积法计算热传导及源码.pdf
- Linux 安装之U盘引导
- 昆明学院计算机专业在哪个校区,昆明学院有几个校区及校区地址