このアルゴリズムは、それらすべてを見つけるでしょう、あなたは簡単に最小限の部分配列を見つけるためにそれを変更することができます。
int[] input array
が与えられた場合、int[] tmp
の配列を作成してtmp[i] = tmp[i - 1] + input[i];
という配列を作成し、tmpの各要素にその要素までの入力の合計が格納されるようにすることができます。
ここで、tmpをチェックすると、お互いに等しい値があることがわかります。この値がインデックスj
とk
とであるとすると、合計が0のサブアレイはインデックスj + 1
からk
になります。注:j + 1 == k
の場合、k is 0
とそれだけです! ;)
注:アルゴリズムが実装がBrokenGlassにより示唆されるようにHashMapを使用してなど、さまざまな方法で行うが、上記の注では、特殊なケースに注意してくださいすることができ、仮想tmp[-1] = 0;
を検討すべきです。
例:3 = 0に
int[] input = {4, 6, 3, -9, -5, 1, 3, 0, 2}
int[] tmp = {4, 10, 13, 4, -1, 0, 3, 3, 5}
- 注インデックス0及び3でtmpに値4 ==>和TMP 1、長さ(3 - 1)+ 1 = 4
- インデックス5のtmpの値0 ==>合計tmp 0〜5 = 0、長さ(5 - 0)+ 1 = 6に注意してください。
- インデックス6と7のtmpの値3に注意==>合計tmp 7 〜7 = 0、長さ(7-7)+1 = 1
もしあなたがそれを欺瞞として見たら質問してください。あなたが答えが不十分であると思うなら、あなたはそれらにコメントしなければなりません、そして/または、この[オリジナルの]質問に恩恵を与えて、注意を喚起してください。 – amit
@amitこの質問でマイケルが述べたように、元の "ゼロ和サブアレイ"の質問は壊れています!受け入れられた答えはもはや利用できないリンクを持っています – Gevorg