LeetCode 004 Median of Two Sorted Arrays *

来源:互联网 发布:单片机可靠性 编辑:程序博客网 时间:2024/06/13 03:41

题目大意是,有两个排好序的整数数组,要求两个整数数组中所有数字的中位数。题目里面要求使用O(log(m+n))的算法,其中m和n是数组长度。

既然已经要求了时间复杂度,也没有必要问输入数据量的大小了。首先想到的是线性时间复杂度的算法,既然两个数组已经排好序了,那么就可以使用线性时间将两个有序数组合并为一个有序数组,再访问数组中点求中位数即可。时间复杂度为O(m+n)。

然后思考有没有更快的算法。很遗憾我没有想到O(log(m+n))的算法的算法怎么做。我的想法:数组中的每一个数都有一个rank,即合并为一个有序数组之后的index,知道rank就可以找到中位数。因为两个数组都是单调的,所以两个数组中每个整数的rank也是单调的。所以我们可用二分法找到我们需要的中位rank,即可求得中位数。要求一个数的rank,可以在另一个数组中用二分查找找到这个数可以插入的位置,结合数组的有序性,即可求出rank的范围(因为有可能有重复的数,所以是范围)。算法中有两个二分法嵌套,所以时间复杂度是O((log(m+n))^2)。空间复杂度是O(m+n)。

最有的算法没想到,所以在题目上打了星号,有时间再做一遍。

其实LeetCode评测也没有很大的数据规模,估计用线性算法也能Accept。

0 0