题目链接

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)).

求两个有序数组的中位数,如果总元素个数是偶数,中位数是中间两个元素的平均值

 

详细讲解请参考我的另一篇博文:求两个有序数组的中位数或者第k小元素,那篇博文中如果数组总元素个数是偶数,求的是上中位数。

对于那篇博文中的算法2,这一题不能简单的套用,因为如果按照算法2的删除规则,当元素个数是偶数时,有可能把某个中位数删除了,比如对于数组【3,4】,【1,2,5,6】,比较4、5后就会把第一个数组中的3删除,但是3是要参与中位数的计算的。因此对于偶数个数的数组,我们加了一些判断,但是很复杂,代码如下,这里不推荐这种做法

 1 class Solution {
 2 public:
 3     double findMedianSortedArrays(int A[], int m, int B[], int n) {
 4         int mid_a = m/2, mid_b = n/2;
 5         if(m == 0)
 6         {
 7             if(n % 2 == 0)
 8                 return (B[mid_b] + B[mid_b-1]) / 2.0;
 9             else return B[mid_b];
10         }
11         else if(n == 0)
12         {
13             if(m % 2 == 0)
14                 return (A[mid_a] + A[mid_a-1]) / 2.0;
15             else return A[mid_a];
16         }
17     
18         if(m == 1)
19         {
20             if(n == 1)
21                 return (A[0] + B[0]) / 2.0;
22             if(n % 2 == 0)
23             {
24                 if(A[0] >= B[mid_b])
25                     return B[mid_b];
26                 else if(A[0] <= B[mid_b-1])
27                     return B[mid_b-1];
28                 else return A[0];
29             }
30             else
31             {
32                 if(A[0] >= B[mid_b+1])
33                     return (B[mid_b] + B[mid_b+1]) / 2.0;
34                 else if(A[0] <= B[mid_b-1])
35                     return (B[mid_b] + B[mid_b-1]) / 2.0;
36                 else return(B[mid_b] + A[0]) / 2.0;
37             }
38         }
39         else if(n == 1)
40         {
41             if(m % 2 == 0)
42             {
43                 if(B[0] >= A[mid_a])
44                     return A[mid_a];
45                 else if(B[0] <= A[mid_a-1])
46                     return A[mid_a-1];
47                 else return B[0];
48             }
49             else
50             {
51                 if(B[0] >= A[mid_a+1])
52                     return (A[mid_a] + A[mid_a+1]) / 2.0;
53                 else if(B[0] <= A[mid_a-1])
54                     return (A[mid_a] + A[mid_a-1]) / 2.0;
55                 else return(A[mid_a] + B[0]) / 2.0;
56             }
57         }
58         
59         bool flag = false;
60         if(m == 2 && n%2 == 0)
61         {
62                 if(A[0] <= B[0] && A[1] >= B[n-1])
63                     return (B[mid_b] + B[mid_b-1]) / 2.0;
64                 else if(A[0] >= B[0] && A[1] <= B[n-1])
65                     return findMedianSortedArrays(A, m, &B[1], n-2);
66                 flag = true;
67         }
68         else if(n == 2 && m%2 == 0)
69         {
70                 if(B[0] <= A[0] && B[1] >= A[m-1])
71                     return (A[mid_a] + A[mid_a-1]) / 2.0;
72                 else if(B[0] >= A[0] && B[1] <= A[m-1])
73                     return findMedianSortedArrays(&A[1], m-2, B, n);
74                 flag = true;
75         }
76         
77     
78             int cutLen = mid_a > mid_b ? mid_b:mid_a;
79             if(m%2 == 0 && n%2 == 0 && flag == false)cutLen--;
80             if(A[mid_a] == B[mid_b])
81             {
82                 if(m%2 == 0 && n%2 == 0)
83                     return (A[mid_a] + max(A[mid_a-1], B[mid_b-1])) / 2.0; 
84                 else 
85                     return (A[mid_a] + B[mid_b]) / 2.0;
86             }
87             else if(A[mid_a] < B[mid_b])
88                 return findMedianSortedArrays(&A[cutLen], m - cutLen, B, n - cutLen);
89             else return findMedianSortedArrays(A, m - cutLen, &B[cutLen], n-cutLen);
90         
91     }
92 };
View Code

相关文章: