Median of Two Sorted Arrays
题意
给你两个已经从小到大排好序的数组,如果将这两个数组有序的合并,求中位数,并且要求算法复杂度为
log(m+n)
解法
这道题目如果不要求复杂度的话就很简单,直接两个数组合并排序然后求中位数,但是那样的算法那复杂度为(m+n)log(m+n)。
这题其实可以套用求第k大元素的方法,对于两个有序数组A,B 我们假设C=A+B,如果A[k/2-1]<B[k/2-1],k/2-1就是各数组中的第k/2大的元素,通过上面的比较我们可以看出,A[0]到A[k/2-1]区间内的值是不可能为C的第K大的值。
上面的结论我们可以用反证法来证明。假设A[k/2-1]大于第K大的值,那么我们认为是第k+1那么大,则在A数组中,小于A[k/2-1]的值至多有k/2-1个,在B数组中比它小的也至多有k/2-1个(因为A[k/2-1]<B[k/2-1]),则至多有k-2那么多元素是小于A[k/2-1],这与A[k/2-1]为第k+1大的值是矛盾的,故假设不成立。
通过上面的证明我们就可以知道,当A[k/2-1]<B[k/2-1]时,我们就可以把A[0]-A[k/2-1]这些数抛弃掉,因为它们不可能是第k大的值.
反之亦然。
这就是一个递归的过程了,我们注意这么几个递归边界:
- 如果某个数组的长度在递归中为0了(比如是a),那我们就输出b[k-1],因为这是b[k-1]就是第k大的数据。
- 当k为1的时候,我们只要比较a,b两个数组的首个元素a[0],b[0]哪个更小就行,它们中的一个就是第K大的数据。
- 当A[k/2-1] == B[k/2-1]时,它们就都是第K大的值。
代码
|
|