2つのソート配列の60.Median(2つのソートされた配列の中央値)

レベル:

  ハード

件名の説明:

2つのソート列がありnums1nums2それぞれサイズ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);
        
    }
}

おすすめ

転載: www.cnblogs.com/yjxyy/p/11089938.html