정렬되지 않은 배열 부분 배열 긴 축적의 문제는 가치를 부여.

문제 설명 : 배열이 포지티브, 네거티브 및 0.5 최장의 길이를 식별하고, 서브 어레이 (k)를 포함 할 수있다.

이 항목에서는 폭력적인 해결 방법이 있습니다 :

생각 : 우리는 부분 배열의 꼬리 노드로 배열의 각 노드를 고려하고, 그 노드, 노드 처음부터 위치를 통과하는 통과, 그것은 제 1 노드와 합 얻은 부분 배열의 길이를 발견 ... 사실이 알고리즘은, 우리는 헤드 노드와 작업에 각 노드를 계산하기 위해, 다시 반복 할 필요가있다.

최적해 : 시간 복잡도가 O (N) 인 해시 MAP 사용은 공간적 복잡도는 O (N)

아이디어 :

도 1에서, 노드의 인덱스 HashMap의 값을 키가 헤드 노드와 상기 노드의 배열이다.

도 2를 다시 배열 이송은, 노드의 선두 노드의 합산 값이 HashMap의 합 키 동등한 존재하는 경우, 수득 - 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