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、左侧最大元素小于右侧最小元素

此时,若全部元素数量为奇数,则左侧最大元素为中位数

若全部元素数量为偶数,则左侧最大和右侧最小的均值为中位数

posted on 2018-10-16 16:09  高数考了59  阅读(110)  评论(0)    收藏  举报