您的位置:首页 > 其它

LeetCode题解——Median of Two Sorted Arrays

2014-06-01 15:16 519 查看
题目

找两个排序数组A[m]和B
的中位数,时间复杂度为O(log(m+n))。

解法

更泛化的,可以找第k个数,然后返回k=(m+n)/2时的值。

代码

class Solution
{
public:
double findMedianSortedArrays(int A[], int m, int B[], int n) {
int total = m + n;
if(total & 0x1)  //总数为奇数,返回中位数
return (double)findKthSortedArrays(A, m, B, n, total/2 + 1);
else             //总数为偶数,返回中间两个数的平局值
return (findKthSortedArrays(A, m, B, n, total/2) +
findKthSortedArrays(A, m, B, n, total/2 + 1)) / 2.0;
}

private:
int findKthSortedArrays(int A[], int m, int B[], int n, int k)
{
if( m > n )  //保证第一个数组比第二个短
return findKthSortedArrays(B, n, A, m, k);
if( m == 0 ) //短数组为空
return B[k - 1];
if( k == 1 ) //求第1个元素
return min(A[0], B[0]);

int ia = min(k/2, m), ib = k - ia;   //比较各自的第k/2个元素,如果短数组长度小于k/2则用最后一个元素来做比较,B数组也相应调整比较的元素
if( A[ia - 1] > B[ib - 1] )    //短数组的大,那个短数组的右边部分必然排在第k之后,同理长数组左边的部分必然都在第k之前
return findKthSortedArrays(A, ia, B + ib, n - ib, k - ib);
else if( A[ia - 1] < B[ib - 1] )
return findKthSortedArrays(A + ia, m - ia, B, ib, k - ia);
else
return A[ia - 1];      //如果相等则找到
}
};
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: