直接排序

直接使用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的最后面。


这里,我们列举极端例子

  1. 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. 合并排序的数组相关推荐

  1. Leetcode面试题 10.01. 合并排序的数组(C语言)

    Leetcode面试题 10.01. 合并排序的数组(C语言) 题目: 给定两个排序后的数组 A 和 B,其中 A 的末端有足够的缓冲空间容纳 B. 编写一个方法,将 B 合并入 A 并排序.初始化 ...

  2. Leetcode 面试题 10.01. 合并排序的数组 (每日一题 20210616)

    给定两个排序后的数组 A 和 B,其中 A 的末端有足够的缓冲空间容纳 B. 编写一个方法,将 B 合并入 A 并排序.初始化 A 和 B 的元素数量分别为 m 和 n.示例:输入: A = [1,2 ...

  3. 2022-4-1 Leetcode 面试题10.01合并排序的数组

    第一版,使用库函数 class Solution {public:void merge(vector<int>& A, int m, vector<int>& ...

  4. 面试题 10.01. 合并排序的数组

    面试题 10.01. 合并排序的数组 思路:①把B数组放在A数组后面,然后排序.O((n+m)²),太蠢了代码不写 ②copyA数组,然后两个指针判度copyA,和B的值那个小,小的放在A数组中,然后 ...

  5. 程序员面试金典 - 面试题 10.01. 合并排序的数组

    1. 题目 给定两个排序后的数组 A 和 B,其中 A 的末端有足够的缓冲空间容纳 B. 编写一个方法,将 B 合并入 A 并排序. 初始化 A 和 B 的元素数量分别为 m 和 n. 示例: 输入: ...

  6. python【力扣LeetCode算法题库】面试题 10.01-合并排序的数组

    面试题 10.01. 合并排序的数组 给定两个排序后的数组 A 和 B,其中 A 的末端有足够的缓冲空间容纳 B. 编写一个方法,将 B 合并入 A 并排序. 初始化 A 和 B 的元素数量分别为 m ...

  7. Leetcode 面试题 08.01. 三步问题

    Leetcode 面试题 08.01. 三步问题 1.问题分析 2.问题解决 3.总结 1.问题分析 题目链接:https://leetcode-cn.com/problems/three-steps ...

  8. python 合并排序的数组

    | 合并排序的数组 给定两个排序后的数组 A 和 B,其中 A 的末端有足够的缓冲空间容纳 B. 编写一个方法,将 B 合并入 A 并排序. 初始化 A 和 B 的元素数量分别为 m 和 n. 示例: ...

  9. LeetCode 面试题 10.02. 变位词组

    面试题 10.02. 变位词组 Ideas 互为变位词的两个字符串包含的字符相同,因此对两个字符串分别进行排序之后得到的字符串一定是相同的,可以将排序之后的字符串作为哈希表的键. 在Python里面有 ...

最新文章

  1. GIT入门笔记(4)- GIT 安装
  2. Python之pandas:数据类型变换之object、category、bool、int32、int64、float64以及数据类型标准化之详细攻略
  3. yii urlmanager配置post不生效_一文带你彻底学会 Git Hooks 配置
  4. pandas打印全部列_python——pandas练习题1-5
  5. Jquery 日期组件
  6. SEO中HTML标签权重列表
  7. 行业最大!黑鲨5系列将搭载5320mm²双VC散热:冰封骁龙8
  8. 学生电脑哪个牌子好_香米哪个牌子好
  9. php 自定义 引用函数,php总结6——自定义函数、引用传值
  10. c语言system.h头文件下载,c语言头文件大全
  11. IOS学习之Segue
  12. 计算机专业应届生简历英语作文,计算机专业毕业生英文简历范文
  13. sqlserver导入sql文件的方式
  14. 计算机用户账户类型有哪些,2010年职称计算机考试:用户账户类型
  15. I Incoming Asteroids(优先队列)
  16. R语言Outliers异常值检测方法比较
  17. 推荐 6 个火爆 GitHub 的开源项目
  18. VUE+WebPack游戏设计:欲望都市城市图层的设计
  19. 注销Apple ID账号
  20. mysql解决Access denied for user ''@'localhost' to database 'mysql'没有mysql库

热门文章

  1. 洛谷P1757 通天之分组背包 [2017年4月计划 动态规划06]
  2. css cursor url用法格式详解
  3. 好消息,关于2005的default provider
  4. mysql jion 实现原理_MySQL-join的实现原理、优化及NLJ算法
  5. 大数据胸_喂母乳会导致胸下垂?!你被这个谣言骗了多少年?
  6. matlab提取艾里斑,艾里斑:我不是雀斑
  7. qq五笔linux,QQ五笔 - 五笔小字典 QQ绑定很实用
  8. 二维有限体积 matlab,二维有限体积法计算热传导及源码.pdf
  9. Linux 安装之U盘引导
  10. 昆明学院计算机专业在哪个校区,昆明学院有几个校区及校区地址