Leetcode 4 O(log(m+n))复杂度的求两个有序数组的中位数的算法

  这题是408上面有的题目。。。

  我记得原题是这样的,求两个升序数组的中位数。那么可以用二分的办法来解决这个问题,

首先就是分别找A和B两个数组的中位数,如果A数组和B数组的中位数相等,那么显然这两个各

自的中位数就是两个数组合并之后的大数组的中位数。(显然这里求中位数复杂度为O(1)).

  如果中位数A小于中位数B,那么就可以求两个中位数中间部分的中位数,,,,但是似乎前提

是这两个数组的长度是相等的,就要分奇数偶数来判断了,总之就是通过中位数,前面抛弃一半,后面抛弃一半

,在剩下的一半上找中位数。

   (然后默默想一下,似乎这和两个数组的长度相等或者不相等没有关系,不相等一样的方法)

 

  但是,现在情况进阶了,现在要求的是在长度分别为n和m的两个有序数组上面求出合并后的整个数组的

第k大。

  那么现在怎么用分治的思想来解决这个问题呢?

  不要被一半迷惑了,这里还是k/2,来二分。

  就是有点绕,前面是求A的中位数和B的中位数,这样就求出了整个数组的中位数。而这里是求A数组的第

k/2个元素和B数组的k/2个元素,这样就求出了整个数组的第k大。要脑子转一下。

 

 

  剩下的就是编码的细节部分了。整体还是和线段树的query操作有很多的相似之处的。

posted @ 2021-04-14 20:54  TheDa  阅读(161)  评论(0编辑  收藏  举报