Leetcode04 寻找正序数组的中位数
问题描述:
bobo老师好,我刷力扣二分查找的题的时候做到了这题,我使用归并的merge方法做出来了,但是无法理解使用二分查找解决该问题。看了解析大概看懂是如果寻找mid的值,可以每次都排除mid/2个元素,如果nums1[mid/2]<nums[mid/2],那数组nums1中[0,mid/2]是不可能是中位数,但这个很难理什么原因,想请问老师关于有关于二分查找法的解法
正在回答 回答被采纳积分+1
你的描述不对。这个问题的二分查找法的思路,不是“如果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 星