문제 설명 : 배열이 포지티브, 네거티브 및 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;
}
}