第一次写文章,希望大家可以给我一点建议、留言,谢谢。
问题:
leetCode问题:求两个有序数组的中位数,时间复杂度要求 O( log(n+m) )
思路
下面是我自己的一种理解(来源于代码),自认为这种理解比较简单。
1.归并思想
这种算法比较容易理解,只需要计算出前面 (n + m + 1)/ 2 个就行了,不需要多说。不过不符合时间复杂度的要求。
2.二分法 / 折半查找
先说一下中位数,中位的把数组分为两个元素数量相等的两部分,并且左边最大值一定 <= 右边最小值。对于这道题,我们假设找到中位数后,一定会出现下面的情况:
红线分开的两边元素个数相等,并且Max( A[i-1], B[j-1 ]) <= Min(A[i], B[j]); i和j是下标
所以,我们完全可以把这个问题转化成:二分法查找有序数组里符合要求的数。
这个要求就是:
(1)两边元素数量各占一半,即 half = (n + m + 1) / 2; // n 和 m 为两个数组的长度。
(2)Max(A[i-1], B[j-1]) <= Min(A[i], B[j]);
条件