1.Median of Two Sorted Arrays
原文链接:点击这里进入
基本内容:
There are two sorted arrays A and B of size m and n respectively. Find the median of the two sorted arrays. The overall run time complexity should be O(log (m+n)).
解题思想:
o(m + n)的解法比较直观,直接合并两个数组,并且求第k大的元素。 如果是找到第k大的元素,我们只需要设置两个指针 pA与pB,分别指向数组A 和数组B,如果数组A单前元素小,则pA++,如果数组B当前元素小pB++ 同时设置一个元素记录前进个个数m,当这个前进个数m = k 的时候,就可以找到了。
中位数:
当变量值的项数N为奇数时,处于中间位置的变量值即为中位数;当N为偶数时,中位数则为处于中间位置的2个变量值的平均数。(注意:中位数和众数不同,众数指最多的数,众数有时不止一个,而中位数只能有一个。
了解了中位数的概念,我们需要分情况讨论,当m+n 是奇数或者是偶数的情况。
继续刚才的时间复杂度的讨论,题目要求时间复杂度是o(m + n),且根据两个数组都是已经排序好的,我们可以可以想到使用二分查找类似的方法。 o(m+n)的方法中,我们是每比较一次,指针加1,这样需要比较k次,才能得出结果。那么如果我们每次都可以比较k的一半呢。
假设A和数组B的元素个数都大于k/2个, 我们将A[ k/2-1]与B[k/2-1]的值进行比较,会出现以下3种情况,
- A[ k/2-1] == B[k/2-1],则我们恰好可以确定合并数组之后前k个值,
- A[ k/2-1] > B[k/2-1], 那么我们首先可以确定B[0] 到B[k/2 -1]这其中k/2个值一定是合并数组中中的k个值,也就是说合并数组前k位中一定会包含这k/2个值
- A[ k/2-1] < B[k/2-1], 同上分析 A[0] 到A[k/2 -1]中的值一定会在合并数组中前k位中。
因此我们可以实现一个递归函数,来完成这个功能。
代码:
double findMedianSortedArrays(int A[], int m, int B[], int n) {
int half = m + n;
if( half & 0x1 )
return FindKthNumberInArrays( A, m, B, n, ( half + 1 ) / 2 );
else
{
double result = ( FindKthNumberInArrays( A, m, B, n, half / 2 ) +
FindKthNumberInArrays( A, m, B, n, half / 2 + 1 ) );
return result / 2.0 ;
}
}
int FindKthNumberInArrays( int A[], int m, int B[], int n, int k )
{
if( m > n )
return FindKthNumberInArrays( B, n, A, m, k );
if( m == 0 )
return B[ k - 1 ];
int pa,pb;
while( k )
{
if( k == 1 )
return min( A[ 0 ], B[ 0 ] );
else
{
pa = min( m, k / 2 );
pb = k - pa;
if( A[ pa - 1 ] == B[ pb - 1 ] )
return A[ pa - 1];
else if ( A[ pa - 1 ] > B[ pb - 1 ] )
{
B = B + pb;
k = k - pb;
}
else
{
A = A + pa;
k = k - pa;
}
}
}
return 0;
}