题目: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大的数;(m+n若为奇数,中位数是第(m+n)/2+1大的数,若为偶数,中位数是位置为(m+n)/2和(m+n)/2+1的平均数);
先假设m,n都大于k/2,比较A[k/2-1]和B[k/2-1]的大小,三种可能:
1. A[k/2-1]==B[k/2-1] 此时A[k/2-1]的值是合并后的第K大的值,返回A[k/2-1]或者B[k/2-1];
2. A[k/2-1]<B[k/2-1] 此时A[k/2-1]的值肯定是在合并后数组第K大的数之前,因此可以舍去;
3. A[k/2-1]>B[k/2-1] 跟第2种情况类似;
边界问题:假设m<n
1. m==0 返回B[k-1];
2. k==1 返回A[0],B[0]中较小者;
方法:将寻找中位数转化成找第K大的数;(m+n若为奇数,中位数是第(m+n)/2+1大的数,若为偶数,中位数是位置为(m+n)/2和(m+n)/2+1的平均数);
先假设m,n都大于k/2,比较A[k/2-1]和B[k/2-1]的大小,三种可能:
1. A[k/2-1]==B[k/2-1] 此时A[k/2-1]的值是合并后的第K大的值,返回A[k/2-1]或者B[k/2-1];
2. A[k/2-1]<B[k/2-1] 此时A[k/2-1]的值肯定是在合并后数组第K大的数之前,因此可以舍去;
3. A[k/2-1]>B[k/2-1] 跟第2种情况类似;
边界问题:假设m<n
1. m==0 返回B[k-1];
2. k==1 返回A[0],B[0]中较小者;
代码:
class Solution {
public:
double findKth(int A[],int m,int B[],int n,int k){
if(m>n) return findKth(B,n,A,m,k);
if(m==0) return B[k-1];
if(k==1) return A[0]<B[0]?A[0]:B[0];
int a=min(k/2,m);
int b=k-a;
if(A[a-1]==B[b-1]) return A[a-1];
else if(A[a-1]<B[b-1]) return findKth(A+a,m-a,B,n,k-a);
else return findKth(A,m,B+b,n-b,k-b);
}
double findMedianSortedArrays(int A[], int m, int B[], int n) {
int len=m+n;
if(len%2) return findKth(A,m,B,n,len/2+1);
else return (double)((double)findKth(A,m,B,n,len/2)+(double)findKth(A,m,B,n,len/2+1))/2;
}
};