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)).
思路简单,就是写起来比较麻烦。
几个注意点:
1,其中一个数组为空的情况
2,两个数组的排列顺序,从大到小或者从小到大
3,其中一个数组全在中位数(median)之前的情况
4,奇偶数的讨论。
1 class Solution { 2 public: 3 double findMedianSortedArrays(int A[], int m, int B[], int n) { 4 if(!m) 5 { 6 if(n%2) 7 return (double)B[n/2]; 8 else 9 return (double)(B[n/2]+B[n/2-1])/2; 10 } 11 if(!n) 12 { 13 if(m%2) 14 return (double)A[m/2]; 15 else 16 return (double)(A[m/2]+A[m/2-1])/2; 17 } 18 bool aSort = true; 19 bool bSort = true; 20 int i = 0; 21 int j = 0; 22 if (A[0] > A[m-1]){ 23 i = m-1; 24 aSort = false; 25 } 26 if (B[0] > B[n-1]){ 27 j = n-1; 28 bSort = false; 29 } 30 int middle; 31 int flag = 0; 32 while(flag < (m+n+1)/2) 33 { 34 if(i<0 || i>m-1) 35 { 36 middle = B[j]; 37 iterat(bSort,&j); 38 ++flag; 39 } 40 else if(j<0 || j> n-1) 41 { 42 middle = A[i]; 43 iterat(aSort,&i); 44 ++flag; 45 } 46 else if(A[i]<B[j]){ 47 middle = A[i]; 48 iterat(aSort,&i); 49 ++flag; 50 } 51 else{ 52 middle = B[j]; 53 iterat(bSort,&j); 54 ++flag; 55 } 56 } 57 if((m+n)%2) 58 return middle*1.0; 59 else{ 60 if(i>m-1 || i<0) 61 { 62 return (middle+B[j])/2.0; 63 } 64 else if(j>n-1 || j<0) 65 { 66 return (middle+A[i])/2.0; 67 } 68 else 69 return (middle+(A[i]<B[j]?A[i]:B[j]))/2.0; 70 } 71 } 72 void iterat(bool sort,int* p) 73 { 74 if(sort) 75 ++*p; 76 else 77 --*p; 78 } 79 };
写得比较长。(┬_┬)