問題の説明:配列が最長の長さとサブアレイkを識別するために、正、負、及び0.5を含んでいてもよいです。
このトピックでは、暴力的な解決のためのメソッドがあります。
思考:我々は、部分配列のテール・ノードとして配列内の各ノードを検討し、そのノードに対して、ノードへの最初から位置を横断する横断、それが最初のノードとの和を得サブアレイ長さに遭遇しました...このアルゴリズムは、実際には、我々は、ヘッドノードおよびジョブに各ノードを計算するために、再び反復処理する必要があります。
最適解:時間複雑度はO(N)であるHashMapを使用して、空間的複雑さはO(N)
アイデア:
図1に示すように、ノードインデックスのハッシュマップの値は、キーは、ヘッドノードとノードアレイです。
キーHashMapの和に等しいがある場合2は、再びアレイ、得られたノードのヘッドノードの合計値を横切る、 - kは、次にとる値は、ノードのインデックスであり、次いでサブアレイの長さを引きました。
図3に示すように、マップノードにおいて決定和の値ではない、そうでない場合はない最長のサブアレイはに対応しているため、もしあれば、存在しない、指標値との和を保存することができ
キー:それは最初の要素に可能であるので、最長のサブ配列の最初のノードであり、第1キーは、ストレージマップの要素の値は0であり、-1
コードは以下の通りです
package Array;
import java.util.HashMap;
public class LongestSubArrayEqualsSum2 {
public static int longestSubArrayEqualsSum2(int[] array,int k){
HashMap<Integer,Integer> map = new HashMap<>();
int len = 0;//和为k的最长子数组长度
int sum = 0;
map.put(0,-1);
for(int i = 0; i < array.length; i++){
sum += array[i];
if(map.containsKey(sum - k)){
len = len > map.get(sum - k)?len:map.get(sum - k);
}
if(!map.containsKey(sum)){
map.put(sum,i);
}
}
return len;
}
}