정수 배열 및 정수 k를 감안할 때, 당신은 합이 k로 동일 연속 하위 어레이의 총 수를 찾을 필요가있다.
예 1 :
입력 : nums의 = [1,1,1], K = 2 출력 : 2
노트 :
- 어레이의 길이는 [20000, 1]의 범위에있다.
- 배열의 숫자 범위는 [-1000, 1000]이고, 정수 k의 범위는 [-1e7, 1E7]이다.
1. 용액 접두사 합계, O (N ^ 2) 런타임 O (N) 공간
1. 입력 어레이의 프리픽스 합계를 계산;
각 서브 어레이 간격 2. 그 합을 확인하면, k는 결과 그렇다면 카운터에 1을 추가 같다. 이 단계는 O (N ^ 2) 시간이 걸린다.
클래스 해결 { 공개 INT subarraySum ( INT [] nums, INT의 K) { INT N = nums.length; INT [] = prefixSum 새로운 INT [N + 1 ]; 위한 ( int로 난 ++ I = 1; 나는 <= N ) { prefixSum [I] = prefixSum [I - 1] + nums [I - 1 ]; } INT의 카운트 = 0 ; 위한 ( int로 ; i가 N <I는 I = 0 ++ ) { 위해 ( INT의 J <= N; J = I + 1, J ++) { 경우 (prefixSum [J] - prefixSum [I] == K) 카운트 ++ ; } } 반환 계산; } }
솔루션 2의 HashMap, O (N) 실행 시간과 공간 접두사 합계
1. 실행 프리픽스 합계 각각 상이한 프리픽스 합산 값의 카운트를 저장하는 해시 맵 유지; 빈 간격 0의 합을 나타내는, (0, 1)에 해시 맵에 추가.
K - 즉 PS 동일한 프리픽스 합있을 경우 2. 주어진 접두어 합 (PS)에 대해 확인한다. PS의 그러한 프리픽스 합 - K는 K 합과의 간격이있는 것을 의미한다. 이러한 각각의 프리픽스에 대한 합계 최종 카운터에 1을 추가한다.
3. 나중에 확인을위한 해시 맵에 현재 접두어 합계를 추가 할 수 있습니다.
이 솔루션은 쉽게 그 합은 k로 모든 간격을 얻기 위해 수정 될 수 있습니다. 다만 현재 요소의 인덱스를 가지고 해시 맵의 값을 증가.
클래스 해결 { 공개 INT subarraySum ( INT [] nums, INT의 K) { 지도 <정수 정수> =지도 새로운 HashMap의 <> (); INT prefixSum = 0, = 0를 계산 ; map.put ( 0, 1 ); 위한 ( int로 ; 나는 nums.length <I는 I = 0 ++ ) { prefixSum + = nums [I]을; 카운트 + = map.getOrDefault (prefixSum - K, 0 ); map.put (prefixSum, map.getOrDefault (prefixSum, 0) + 1 ); } 반환 카운트; } }