サブアレイ和最も近いです

説明

整数配列が与えられ、合計がゼロに近いとの部分配列を見つけます。最初の番号と最後の番号のインデックスを返します。

任意の数の合計はであることが保証されている  [-2 ^ {31}、2 ^ {31} -1] [ - 2 3 1 2 3 1 - 1 ]。

例1

Input: 
[-3,1,1,-3,5] 
Output: 
[0,2]
Explanation: [0,2], [1,3], [1,1], [2,2], [0,4]

チャレンジ

O(nlogn)時間

クラス対{
    私はint型。
    int型のインデックス。
    公共のペア(INT S、iはINT){
        合計= S;
        インデックス= I;
    }
}
    
パブリッククラスソリューション{
    / **
     * @paramのNUMS:整数のAリスト
     * @return:整数のAリストは、最初の数字のインデックスを含んでいます 
     *そして最後の数字のインデックス
     * /
    公共のint [] subarraySumClosest(INT [] NUMS){
        INT [] RES =新しいint型[2]。
        IF(NUMS == NULL || nums.length == 0){
            解像度を返します。
        } 
        
        int型のlen = nums.length。
        IF(LEN == 1){
            何も[0] =無[1] = 0;
            解像度を返します。
        }
        対[]和=新しいペア[lenの+ 1]。
        int型PREV = 0;
        合計[0] =新しいペア(0,0)。
        以下のために(INT I = 1; I <= LEN; I ++){
            合計[I] =新しいペア(PREV + NUMS [I-1]、I)。
            PREV =合計[I] .SUM。
        }
        Arrays.sort(和、新しいコンパレータ<ペア>(){
           比較公共INT(対A、対B){
               リターンa.sum  -  b.sum。
           } 
        });
        int型ANS = Integer.MAX_VALUEで、
        以下のために(INT I = 1; I <= LEN; I ++){
            
            IF(ANS>和[I] .SUM  - 合計[I-1] .SUM){
                ANS =合計[I] .SUM  - 合計[I-1] .SUM。
                INT [] TEMP =新しいINT [] {和[I] .INDEX  -  1、合計[I  -  1] .INDEX  -  1}。
                (TEMP)は、Arrays.sort。
                RES [0] = TEMP [0] + 1。
                RES [1] = TEMP [1]。
            }
        }
        
        解像度を返します。
    }
}

  Q:なぜ我々は、(0,0)を必要とします初期ペアAの:?我々サブアレーこのレッスンで振り返る最初の必要性は、我々は、配列のために、例えばプレフィックス合計と呼ばれる、重要な知識のポイントについて話しました[1,2,3の数の和場合4]、彼のプレフィックス和[1,3,6,10]は、前番号1と、この時の最初の二つの和、前者3及び4元数の数を表していますPrefixSum [0 - あなたはサブアレイから本節(+ 3 2)、番号1のインデックス1とインデックス2及び第3 = PrefixSum [2]の数の和を減算する前に知ってほしいです] = = 5 6--1は添字はX-Xの数である数X、及び対応する特定の指標、問題の存在-1 +あなたが見ることができるフロント間 - 1、添え字xは逆であります最初の数のx + 1、その後の質問あなたはこの期間も2に0からインデックスを計算する場合、ありますか?我々は全体PrefixSumの背面に移動だからPrefixSumへのアクセスを有することになるので、それは、数3に数1である[-1]、ビット0は、0になる前に空いの数と0であります=> [0,1,3,6,10]次にPrefixSum [3]を使用する時間 - PrefixSum [0]、この計算はより一層便利です。この時点で、振り返るその後、0の範囲内で指標となる数の合計は、I-1、このセクションの〜表し、[i]はPrefixSum私の前に、なぜ我々はそれの(0,0)のペアが必要なのでしょうか?前者ISは0,0 0 0アレイと数nの数を表しているので、それは数後プレフィックス和アレーは、よりアウトになりなります

おすすめ

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