[LeetCode 560] 서브 어레이 합계 K 같음

정수 배열 및 정수 k를 감안할 때, 당신은 합이 k로 동일 연속 하위 어레이의 총 수를 찾을 필요가있다.

예 1 :

입력 : nums의 = [1,1,1], K = 2 
출력 : 2

 

노트 :

  1. 어레이의 길이는 [20000, 1]의 범위에있다.
  2. 배열의 숫자 범위는 [-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 ); 
        }
        반환 카운트; 
    } 
}

 

추천

출처www.cnblogs.com/lz87/p/11601300.html