首页 > 技术文章 > LeetCode题解——Median of Two Sorted Arrays

qieerbushejinshikelou 2014-06-01 15:16 原文

题目

找两个排序数组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 };

 

推荐阅读