Leetcode04 寻找正序数组的中位数

Leetcode04 寻找正序数组的中位数

问题描述:

bobo老师好,我刷力扣二分查找的题的时候做到了这题,我使用归并的merge方法做出来了,但是无法理解使用二分查找解决该问题。看了解析大概看懂是如果寻找mid的值,可以每次都排除mid/2个元素,如果nums1[mid/2]<nums[mid/2],那数组nums1中[0,mid/2]是不可能是中位数,但这个很难理什么原因,想请问老师关于有关于二分查找法的解法

正在回答 回答被采纳积分+1

登陆购买课程后可参与讨论,去登陆

1回答
liuyubobobo 2021-08-11 06:22:30

​你的描述不对。这个问题的二分查找法的思路,不是“如果nums1[mid/2]<nums1[mid/2],那数组nums1中[0,mid/2]不可能是中位数


二分查找法的思路是,把整个问题转换成求解两个数组中所有元素的第 k 小元素。

如果两个数组的元素总数是奇数,就是求第 k = (m + n) / 2 小元素;

如果两个数组的元素总数是偶数,就是求 k = (m + 2) / 2 和 k = (m + 2) / 2 + 1 小的元素。然后二者求平均。

(这里描述的 k 是 1-based 的)


所以,如果要高明白这个方法,请一定要理解这个课程中这个作业的内容:https://class.imooc.com/lesson/1582#mid=37052 

这个问题是 selectK 的拓展,是在两个数组上求解 selectK 问题。


在这个基础上,我们每次看 A[k / 2 - 1] 和 B[k /2 - 1] 的值。这个 - 1 至关重要。因为有这个 -1,我们保证了这两个索引前的元素,最多不可能超过 k。所以,我们比较这二者的最小值,最小值所在数组的左边所有元素可以放心的删掉。但是,删掉之后,k 是要更新的。比如删掉了 a 个元素,那么我们就变成了求删掉数组之后所有的元素的 k - a 小元素。(依然是,这个思路是和在一个数组上求 selectK 一致的。)


当然,这个问题的边界条件比在一个数组中求解第 k 小元素要多多了,但整体思路就是如此。如果你想要挑战自己,可以根据这个思路去编写代码,仔细调试每一个可能出错误的错误用例。


不过,整体这个问题在面试中被考察的概率不大,但 selectK 算法一定要掌握。


继续加油!:)

问题已解决,确定采纳
还有疑问,暂不采纳

恭喜解决一个难题,获得1积分~

来为老师/同学的回答评分吧

0 星
算法与数据结构
  • 参与学习       2594    人
  • 解答问题       1091    个

慕课网算法名师Liuyubobobo,5年集大成之作 从0到工作5年,算法与数据结构系统解决方案

了解课程
请稍等 ...
意见反馈 帮助中心 APP下载
官方微信

在线咨询

领取优惠

免费试听

领取大纲

扫描二维码,添加
你的专属老师