1 class Solution { 2 public: 3 double findMedianSortedArrays(vector<int>& nums1, vector<int>& nums2) { 4 if(nums1.size()>nums2.size()) 5 swap(nums1, nums2); 6 int sz1=nums1.size(); 7 int sz2=nums2.size(); 8 int left=0,right=sz1,half_len=(sz1+sz2+1)>>1; 9 while(left<=right){ 10 int cut1=(right-left)/2+left; 11 int cut2=half_len-cut1; 12 if(cut1<sz1&&nums1[cut1]<nums2[cut2-1]) 13 left=cut1+1; 14 else if(cut1>0&&nums1[cut1-1]>nums2[cut2]) 15 right=cut1-1; 16 else{ 17 int left_max=0; 18 if(cut1==0) 19 left_max=nums2[cut2-1]; 20 else if(cut2==0) 21 left_max=nums1[cut1-1]; 22 else 23 left_max=max(nums1[cut1-1], nums2[cut2-1]); 24 if((sz1+sz2)%2==1) 25 return left_max; 26 27 int right_min=0; 28 if(cut1==sz1) 29 right_min=nums2[cut2]; 30 else if(cut2==sz2) 31 right_min=nums1[cut1]; 32 else 33 right_min=min(nums1[cut1], nums2[cut2]); 34 35 return (left_max+right_min)/2.0; 36 } 37 } 38 return 0.0; 39 } 40 };
本质就是对较短数组进行二分查找,找到一个下标 i ,使得 i 和其对应的较长数组中的 j 满足以下条件:
1、i + j = (m + n + 1 )/ 2
2、左侧最大元素小于右侧最小元素
此时,若全部元素数量为奇数,则左侧最大元素为中位数
若全部元素数量为偶数,则左侧最大和右侧最小的均值为中位数