最大平均サブアレイII

説明

正と負の番号の配列を指定し、見つけ  maximum average subarray なければならない大きな長さを、または所定の長さに等しいです  k

配列のサイズが大きいかと等しくなることが保証だ  K

例1:

Input:
[1,12,-5,-6,50,3]
3
Output:
15.667
Explanation:
 (-6 + 50 + 3) / 3 = 15.667

例2:

Input:
[5]
1
Output:
5.000
アイデア:半分答え
二つの平均を分離した後、各アレイの数は、平均減算され、タスクは、長さ> =サブアレイK、彼以上の0があるかどうか、配列を見つけることです。
このステップはうまく最大サブアレイに似た溶液を用いて行われています
パブリッククラスソリューション{ 
    / ** 
     * @paramのNUMS:正と負の数の配列
     * @paramのK:整数
     * @return:最大平均
     * / 
     
    プライベートブールcanFind(INT [] NUMS、INT K、ダブル平均) { 
        ダブルrightSum = 0、leftSum = 0、minLeftSum = 0。
        以下のために(INT I 0 =; I <K; I ++){ 
            rightSum + = NUMS [I] -平均。
        } 
        
        (; I <= nums.length; iが++ {iがkは= INT)のための
            場合(rightSum - minLeftSum> = 0){ 
                trueを返します。
            } 
            IF(I <nums.length){ 
                rightSum + = NUMS [I] -平均。
                leftSum + = NUMS [I - K] -平均。 
                端=ミッド。
                minLeftSum = Math.min(minLeftSum、leftSum)。
            } 
        } 
        falseを返します。
    } 
    公共ダブルmaxAverage(INT [] NUMS、INT K){ 
        ダブル開始、終了、ミッド。
        開始=終了= NUMS [0]。
        用(INT iは= 0; I <nums.length; I ++){ 
            (NUMS [i]は、起動)を開始= Math.min。
            端= Math.max(NUMS [i]は、エンド)。
        } 
        {(+ 1E-5 '末端を開始)しながら
            2 /ミッド=(+端を開始します)。
            IF(canFind(NUMS、K、MID)){ 
                スタート=ミッド。
            }他{ 
        } 
        開始返します。
            } 
    } 
}

  

おすすめ

転載: www.cnblogs.com/FLAGyuri/p/12077420.html