ソートされていない配列部分配列最長の蓄積の問題は、値を与えられました。

問題の説明:配列が最長の長さとサブアレイ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;
    }
}

 

おすすめ

転載: blog.csdn.net/shen19960603/article/details/90901083