レベル:
ハード
件名の説明:
2つのソート列がありnums1とnums2それぞれサイズmとnのは。
2つのソート配列の中央値を検索します。全体的な実行時間の複雑さはO(ログ(M + N))であるべきです。
あなたは、想定し得るnums1をしてnums2は両方とも空にすることはできません。
例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
アイデアの分析:
この方法のコア(二プロ配列の昇順を想定)は、k番目の小数の問題に元の問題を見つけることであり、中央値は、実際に最初の(M + N)/ 2少数。小数点以下kの問題を解決するように長い間、元の問題を解決することができます。
第1のA及びBは、K / 2よりも大きい配列の要素の数は、我々はA [K / 2-1]とB [K / 2-1] 2つの要素を比較することを前提とし、これら2つの要素は、それぞれ、/ k個のAを表します光素子2とBの光素子の第1のK / 2 >、<、および=:これら2つの要素を比較する3つのケースがあります。マージ後のk個の要素AとBの小さな要素の前にその[0] [K / 2-1]を意味する[K / 2-1] <B [K / 2-1]、もし。換言すれば、Aは[K / 2-1] 2つの配列の合流後のkの小さい値よりも大きくないので、我々は、それを破棄することができます。
場合[K / 2-1]>同様の結論B [K / 2-1]時間。
[K / 2-1] = B [K / 2-1]は、我々はk個の小数、すなわち同じ要素を発見した場合、それはMと呼ぶことにします。AとBがあるので、Mより小さいK / 2-1要素は、すなわち、mはkの非常に小さい数です。(、そしてmは中央値ではありませんkが奇数の場合は、一部の人々は、疑問があるかもしれません。ここでの理想化された対価は、実際のコードではわずかに異なっている、K / 2を見つけることです、/ 2は別のものを取得後、株式会社使用数。)
上記の分析を通じて、我々は再帰的な方法を達成することができるがk-採用の小さな数を見つけることです。また、我々はまた、いくつかの境界条件を考慮する必要があります。
如果A或者B为空,则直接返回B[k-1]或者A[k-1];
如果k为1,我们只需要返回A[0]和B[0]中的较小值;
如果A[k/2-1]=B[k/2-1],返回其中一个;
コード:
public class Solution{
public double findMedianSortedArrays(int []A,int []B){
int m=A.length;
int n=B.length;
int l=(m+n+1)/2;
int r=(m+n+2)/2; //两个数组的长度和可能是奇数也可能是偶数
return(getkth(A,0,B,0,l)+getkth(A,0,B,0,r))/2;
}
public double getkth(int []A,int astart,int[]B,int bstart,int k){
if(astart>A.length-1)
return B[bstart+k-1];
if(bstart>B.length-1)
return A[astart+k-1];
if(k==1)
return Math.min(A[astart],B[bstart]);
int amid=Integer.MAX_VALUE;
int bmid=Integer.MAX_VALUE;
if(astart+k/2-1<A.length)
amid=A[astart+k/2-1];
if(bstart+k/2-1<B.length)
bmid=B[bstart+k/2-1];
if(amid<bmid)
return getkth(A,astart+k/2,B,bstart,k-k/2);
else
return getkth(A,astart,B,bstart+k/2,k-k/2);
}
}