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