サブアレイ合計II

説明

正の整数配列を考える  A  と間隔を。その合計与えられた間隔の範囲内にあるサブアレイの数を返します。

サブアレイは、連続的なインデックスを持つ元のアレイの一部です。

例1:

Input: A = [1, 2, 3, 4], start = 1, end = 3
Output: 4
Explanation: All possible subarrays: [1](sum = 1), [1, 2](sum = 3), [2](sum = 2), [3](sum = 3).

例2:

Input: A = [1, 2, 3, 4], start = 1, end = 100
Output: 10
Explanation: Any subarray is ok.
アイデア:

二つのポインタのO(N)アルゴリズム

実際の必要性3つの手では、それは開始位置がプラスと> =が起動しているから、追加のレコードを必要とするため。

左の点の各々について、right_start、right_endを取得右対応する二つの点を残した。前者は、サブアレイ[right_start、左]左端は、左の[その右端を示しており、より少ない開始点以下であることを示していますright_end]サブアレイは、エンドポイントよりも大きくありません。

right_end - right_start + 1は、左点として左に法的サブアレイの数です。

左から右に列挙し、左、およびright_startは、right_endも上昇するだけ左に成長するので、時間計算量はO(N)であります

O(NlogN)二分法

接頭辞配列を取得し、次に各プレフィックスプリサム[右]、我々は、2つの点がleft_start left_endを必要とする。前者は示し[left_startは、右]サブアレイと終点が後者よりも大きくない左端こと右端[left_end、右]サブアレイ及び以上の始点ことを示しています。

列挙は右、我々は上のleft_start、プリサムでleft_end [0..right]半分を決定するために見ることができます。

概要

上記2つの方法は、エンドポイントのサブアレイのために、同一の全てであり、さらに列挙プロセスの終わりに、追加のエンドポイントの範囲が単調である範囲の終点を確認し、(二つのポインタのOを使用することが可能ですN)が完了します。

大した必要はありません、あなたは二分法で両手で包括的な外観を置くことができますが、今回は理論の複雑さは同じである。これらの2つの方法は、まず、それほど複雑をお勧めします。

パブリッククラスソリューション{ 
    / ** 
     * @param A:Anは配列整数
     * @param開始:整数
     * @param終了:整数
     * @return:可能な答えの数
     * / 
   パブリックINT subarraySumII(INT [] A、INT開始、INT端){ 
        int型のn = A.length。
        (N == 0){もし
            戻り0; 
        } 

        INT []和=新しいINT [N + 1]。
        INT I、L、R、RES = 0。
        和[0] = 0; 
        ため(I 1 =、iが<= N; ++ I){ 
            和[I] =和[I - 1] + A [I - 1]。
        } 

        、L = R = 0。
        ための式(I = 1; iが<= N; ++ I){
            - (<和[L] I &&和[I]>端L){つつ
                ; ++ L 
            } 

            (R <I &&和[I] -和[R]> =開始)一方{ 
                ++ R。
            } 

            RES + = R - L。
        } 

        RESを返します。
    } 
}

  

おすすめ

転載: www.cnblogs.com/FLAGyuri/p/12078494.html
おすすめ