(この質問は難しい)
タイトル説明:シーケンスの2つの行がありますが、ソートされ、nums1のnums2されている、サイズはMであり、nは、2つの配列の中央値がソートされている見つけるために、時間の複雑さが要求されますO(ログ(M + N) )。あなたはnums1とnums2 2つの配列が空にすることはできませんと仮定することができます。
输入样例1:
nums1 = [1, 3]
nums2 = [2]
The median is 2.0
输入样例2:
nums1 = [1, 2]
nums2 = [3, 4]
The median is (2 + 3)/2 = 2.5
問題を解決する前に、私たちはどのような役割中央値を理解する必要がありますか?
中央値は、同じ長さの2つのサブセットに一組を区別するために使用され、さらにサブセットに要素の全てよりも少ないのサブセットの要素の2つのサブセット、すなわち、長さ(subSet1)==長さ(subSet2 ) そして、max(subSet1)<=分( subSet2)
実装コード
class Solution {
public:
double findMedianSortedArrays(vector<int>& nums1, vector<int>& nums2) {
int m=nums1.size();
int n=nums2.size();
if(m>n){
vector<int> temp=nums1;
nums1=nums2;
nums2=temp;
int tem=m;
m=n;
n=tem;
}
int iMin=0,iMax=m,half=(m+n+1)/2;
while(iMin<=iMax){
int i=(iMin+iMax)/2;
int j=half-i;
if(i<iMax&&nums2[j-1]>nums1[i]){
iMin=i+1;
}
else if(i>iMin&&nums1[i-1]>nums2[j]){
iMax=i-1;
}
else{
int maxLeft=0;
if(i==0){maxLeft=nums2[j-1];}
else if(j==0){maxLeft=nums1[i-1];}
else{maxLeft=max(nums1[i-1],nums2[j-1]);}
if((m+n)%2==1){return maxLeft;}
int minRight=0;
if(i==m){minRight=nums2[j];}
else if(j==n){minRight=nums1[i];}
else{minRight=min(nums2[j],nums1[i]);}
return (maxLeft+minRight)/2.0;
}
}
return 0.0;
}
};