class Solution {
public:
double findMedianSortedArrays(vector<int>& nums1, vector<int>& nums2) {
if(nums1.size() > nums2.size())
swap(nums1, nums2);
int len1 = nums1.size();
int len2 = nums2.size();
int half = (len1+len2+1)>>1;
int left=0, right=len1;
while(left <= right){
int mid = left + ((right-left)>>1);
int cut = half - mid;
if(mid>0 && nums1[mid-1]>nums2[cut])
right = mid-1;
else if(mid<right && nums2[cut-1]>nums1[mid])
left = mid+1;
else{
int left_max = 0;
if(mid>0 && cut>0)
left_max = max(nums1[mid-1], nums2[cut-1]);
else if(mid == 0)
left_max = nums2[cut-1];
else
left_max = nums1[mid-1];
if((len1+len2)%2 == 1)
return left_max;
int right_min = 0;
if(mid<len1 && cut<len2)
right_min = min(nums1[mid], nums2[cut]);
else if(mid == len1)
right_min = nums2[cut];
else
right_min = nums1[mid];
return (left_max+right_min)/2.0;
}
}
return 0.0;
}
};
将较短的数组存在nums1中,然后对nums1使用二分做切分,通过一个固定变量half来找到当前nums1的切分情况下,对应的nums2的切分点,这样能保证将整个数组等分为两部分。这里,nums1切分为左右两部分,nums2切分为左右两部分。总的切分是左+左,右+右,且如果两个数组的元素数量和为奇数,则左半侧多1个数。每次切分,判定左侧两个最大元素和右侧两个最小元素的大小关系,切分停止的标准是左侧所有元素均小于右侧,然后开始找中位数。
切分后:
nums1[0] ----- nums1[mid-1] nums1[mid] ----- nums1[len1-1]
nums2[0] ----- nums2[cut-1] nums2[cut] ----- nums2[len2-1]
找中位数的过程中,奇数组则返回left_max,偶数组返回(left_max+right_min)/2.0
需要注意各种边界条件,相当容易错