説明
任意の数の合計はであることが保証されている [-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の数を表しているので、それは数後プレフィックス和アレーは、よりアウトになりなります