中位數是把一個數的集合划分為兩部分,每部分包含的數字個數相同,並且一個集合中的元素均大於另一個集合中的元素。
因此,我們考慮在一個任意的位置,將數組A划分成兩部分。i表示划分數組A的位置,如果數組A包含m個元素,則划分位置有m+1種情況。因此,i的取值范圍是0~m。
當i=0時,表示left_A為空;當i=m時,表示right_A為空。
同理,我們也可以划分B數組:
我們把left_A和left_B放到一個集合中,把right_A和right_B放到一個集合中。
如果想要獲得中位數,要保證len(left_part)==len(right_part),並且max(left_part)<=min(right_part)。
因此,我們要尋找i,使其保證:
還要注意i=0,i=m,j=0,j=n的邊界條件處理。
class Solution { public: double findMedianSortedArrays(vector<int>& nums1, vector<int>& nums2) { vector<int> s(nums1); vector<int> l(nums2); int m=nums1.size(); int n=nums2.size(); if(nums1.size()>nums2.size()) { l=nums1; s=nums2; m=nums2.size(); n=nums1.size(); } int i,j; int low=0; int high=m; int num1,num2; while(low<=high) //這里是對分割位置i進行二分搜索 { i=(low+high)/2; j=(m+n+1)/2-i; if(i>0 && j<n && s[i-1]>l[j]) //i應當減小 high=i-1; else if(j>0 && i<m && l[j-1]>s[i]) //i應當增大 low=i+1; else { if(i==0) num1=l[j-1]; else if(j==0) num1=s[i-1]; else num1=max(s[i-1],l[j-1]); break; } } if((m+n)%2==1) return num1; if(i==m) num2=l[j]; else if(j==n) num2=s[i]; else num2=min(s[i],l[j]); return (num1+num2)/2.0; } };