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 };

 

你可能感兴趣的:(LeetCode)