LeetCode题解——Median of Two Sorted Arrays
题目:
找两个排序数组A[m]和B[n]的中位数,时间复杂度为O(log(m+n))。
解法:
更泛化的,可以找第k个数,然后返回k=(m+n)/2时的值。
代码:
1 class Solution
2 {
3 public:
4 double findMedianSortedArrays(int A[], int m, int B[], int n) {
5 int total = m + n;
6 if(total & 0x1) //总数为奇数,返回中位数
7 return (double)findKthSortedArrays(A, m, B, n, total/2 + 1);
8 else //总数为偶数,返回中间两个数的平局值
9 return (findKthSortedArrays(A, m, B, n, total/2) +
10 findKthSortedArrays(A, m, B, n, total/2 + 1)) / 2.0;
11 }
12
13 private:
14 int findKthSortedArrays(int A[], int m, int B[], int n, int k)
15 {
16 if( m > n ) //保证第一个数组比第二个短
17 return findKthSortedArrays(B, n, A, m, k);
18 if( m == 0 ) //短数组为空
19 return B[k - 1];
20 if( k == 1 ) //求第1个元素
21 return min(A[0], B[0]);
22
23 int ia = min(k/2, m), ib = k - ia; //比较各自的第k/2个元素,如果短数组长度小于k/2则用最后一个元素来做比较,B数组也相应调整比较的元素
24 if( A[ia - 1] > B[ib - 1] ) //短数组的大,那个短数组的右边部分必然排在第k之后,同理长数组左边的部分必然都在第k之前
25 return findKthSortedArrays(A, ia, B + ib, n - ib, k - ib);
26 else if( A[ia - 1] < B[ib - 1] )
27 return findKthSortedArrays(A + ia, m - ia, B, ib, k - ia);
28 else
29 return A[ia - 1]; //如果相等则找到
30 }
31 };