这种方法感觉有点难懂
1 #include "stdafx.h" 2 #include <iostream> 3 #include <vector> 4 using namespace std; 5 6 class Solution{ 7 public: 8 double findMedianSortedArrays(int A[],int m, int B[],int n){ 9 if(m>n) findMedianSortedArrays(B,n,A,m); 10 int minidx=0,maxidx=m,i,j,num1,mid=(m+n+1)>>1,num2; 11 while(minidx<=maxidx) 12 { 13 i=(minidx+maxidx)>>1; 14 j=mid-i; 15 if(i<m&&j>0&&B[j-1]>A[i])minidx=i+1; //取前面部分,如果B[j-1]>A[i],说明A[i]个肯定不含中位数,且中位数只会在A[i-1]的后面,因为B[j-1]多了大于的数,但总中位数的排序却不变 16 else if(i>0&&j<n&&A[i-1]>B[j])maxidx=i-1; 17 else { 18 if(i==0)num1=B[j-1]; 19 else if (j==0)num1=A[i-1]; //i,j 不可能取满 20 else num1=max(A[i-1],B[j-1]); //可能A[i]=B[j-1]和A[i-1]=B[j] 21 break; 22 } 23 24 } 25 if((m+n)&1)return num1; 26 if(i==m)num2=B[j]; 27 else if(j==n)num2=A[i];
else num2 = min(A[i],B[j]); //偶数情况 28 return (num1+num2)/2; 29 30 } 31 32 }; 33 34 int _tmain(int argc, _TCHAR* argv[]) 35 { 36 Solution a; 37 int m,n,x; 38 int A[50],B[50]; 39 cin>>m; 40 for(int i=0;i<m;i++){ 41 cin>>x; 42 A[i]=x; 43 } 44 cin>>n; 45 for(int i=0;i<m;i++){ 46 cin>>x; 47 B[i]=x; 48 } 49 50 51 cout<<a.findMedianSortedArrays(A,m,B,n); 52 53 54 system("pause"); 55 return 0; 56 57 58 }
第二种方法及其巧妙,尤其对数组偶数与奇数的处理
1 class Solution{ 2 public: 3 double findMedianSortedArrays(int A[],int m,int B[],int n){ 4 int total =m+n; 5 if(total &0x1) 6 return find_kth(A,m,B,n,total/2+1); 7 else 8 return (find_kth(A,m,B,n,total/2)+find_kth(A,m,B,n,total/2+1))/2.0; 9 } 10 private: 11 static int find_kth(int A[],int m,int B[],int n,int k); 12 { 13 if(m>n)return find_kth(B,n,A,m,k); 14 if(m==0)return B[k-1]; 15 if(k==1)return min(A[0],B[0]); 16 int ia=min(k/2,m),ib=k-ia; 17 if(A[ia-1]<B[ib-1]) 18 return find_kth(A+ia,m-ia,B,n,k-ia); 19 else if(A[ia-1]>B[ib-1]) 20 return find_kth(A,m,B+ib,n-ib,k-ib); 21 else 22 return A[ia-1]; 23 } 24 }