class Solution {
public:
int findNum(vector<int>&nums1,vector<int>&nums2,int t){
int l1 = 0, h1 = nums1[nums1.size()-1];;
if(nums2.size() > 0) h1 = max(h1,nums2[nums2.size()-1]);
int n = nums1.size(), m = nums2.size();
while( l1 <= h1 ){
int small = 0;
int l2 = 0, h2 = n-1;
int mid1 = (l1+h1)/2;
while(l2 <= h2){
int mid = (l2+h2)/2;
if(nums1[mid]>mid1)h2=mid-1;
else l2=mid+1;
}
small+=l2;
if(small >= t){
h1 = mid1-1;
continue;
}
l2 = 0,h2=m-1;
while(l2 <= h2){
int mid = (l2+h2)/2;
if(nums2[mid]>mid1)h2=mid-1;
else l2 =mid+1;
}
small+=l2;
if(small >= t) h1 = mid1-1;
else l1 = mid1+1;
}
// cout<<l1<<" "<<t<<endl;
return l1;
}
double findMedianSortedArrays(vector<int>& nums1, vector<int>& nums2) {
if(nums1.size() == 0) swap(nums1,nums2);
int n = nums1.size();
int m = nums2.size();
int t = (n+m+1)/2;
int ans = findNum(nums1,nums2,t);
if(t*2==n+m){
ans += findNum(nums1,nums2,t+1);
}
else ans*=2;
return 1.0*ans/2;
}
};
思路:二分第t个数是多大,那么分奇偶求出与中位数有关的数字就行。