합계가 주어진 값과 같은 부분 배열을 찾기위한 누적 합계

우 메르 파 루크

나는 다음 코드의 논리를 이해하려고 노력하고 있지만 논리를 지원하는 수학이 현재 나에게 완전히 명확하지 않기 때문에 코드의 두 부분에 대해 부분적으로 명확하지 않습니다.

  1. 혼란 1 : 배열의 합을 찾기 시작하기 전에지도에 count = 1 인 0을 넣는 이유를 이해하지 못합니다. 어떻게 도움이 되나요?

  2. 혼란 2 :map.put(sum, map.getOrDefault(sum)+1) if () 조건 이후 로 이동 하면 올바른 솔루션을 얻습니다. 그러나 아래 코드와 같이 위치에 넣으면 잘못된 결과가 나타납니다. 문제는 카운트를 찾기 위해 맵에서 sum-k 값을 검색 할 때이 위치가 중요한 이유입니다.

    public int subarraySum(int[] nums, int k) {
    
         HashMap<Integer,Integer> prefixSumMap = new HashMap<>();
         prefixSumMap.put(0, 1); // CONFUSION 1
    
         int sum = 0;
         int count = 0;
    
         for(int i=0; i<nums.length; i++) {
             sum += nums[i];
    
             prefixSumMap.put(sum, prefixSumMap.getOrDefault(sum, 0)+1); //CONFUSION 2
             if(prefixSumMap.containsKey(sum - k)) {
                 count += prefixSumMap.get(sum - k);
             }
         }
    
         return count;
     }
    
WJS

이것이 흥미로울 것입니다. 정수 오버플로로 인해 음수가 발생하지 않도록 long을 사용하는 방법을 수정했습니다.

이 두 방법 모두 양수에 대해 잘 작동합니다. 첫 번째 방법이 훨씬 간단하지만 둘 다 테스트 배열에 대해 동일한 개수를 반환합니다.

public static void main(String[] args) {
Random r = new Random();
long[] vals = r.longs(10_000_000, 1, 1000).toArray();
long k = 29329;
System.out.println(positiveValues(vals, k));
System.out.println(anyValues(vals, k));


public static int positiveValues(long[] array, long k) {
    
    Map<Long,Long> map = new HashMap<>(Map.of(0L,1L));
    int count = 0;
    long sum = 0;
    
    for (long v : array) {
      sum += v;
      map.put(sum,1L);
       if (map.containsKey(sum-k)) {
           count++;
       }
    }
    return count;
}

public static int anyValues(long[] nums, long k) {

     HashMap<Long,Long> prefixSumMap = new HashMap<>();
     prefixSumMap.put(0L, 1L); 

     long sum = 0;
     int count = 0;

     for(int i=0; i<nums.length; i++) {
         sum += nums[i];
         prefixSumMap.put(sum, prefixSumMap.getOrDefault(sum, 0L)+1L);
         if(prefixSumMap.containsKey(sum - k)) {
             count += prefixSumMap.get(sum - k);
         }
     }
     return count;
 }

또한 성명

    long v = prefixSumMap.getOrDefault(sum,  0L) + 1L;

양수 배열의 경우 항상 1을 반환합니다. 이는 이전 합계가 양수 값에 대해서만 다시 발생할 수 없기 때문입니다.

그 진술과 count맵에서 값을 취하여 계산 하는 것은 배열이 양수와 음수를 모두 포함하도록 허용하는 것입니다. 그리고 그것은 참 -k이고 모든 양의 값입니다.

다음 입력의 경우 :

long[] vals = {1,2,3,-3,0,3};

합계가 3 인 부분 배열은 다음과 같습니다.

(1+2), (3), (1+2+3-3), (1+2+3-3+0), (3-3+0+3), (0+3), (3)

음수를 추가하면 이전 합계가 나올 수 있으므로이를 고려해야합니다. 양수 값에 대한 솔루션은이를 수행하지 않습니다.

이것은 모든 음수 값에도 적용됩니다. 경우 k긍정적, no모든 금액은 음수가 될 것이기 때문에 부분 배열을 찾을 수 있습니다. k음수 이면 하나 이상의 하위 배열을 may찾을 수 있습니다.

이 기사는 인터넷에서 수집됩니다. 재 인쇄 할 때 출처를 알려주십시오.

침해가 발생한 경우 연락 주시기 바랍니다[email protected] 삭제

에서 수정
0

몇 마디 만하겠습니다

0리뷰
로그인참여 후 검토

관련 기사

분류에서Dev

주어진 합계로 부분 배열 찾기

분류에서Dev

파이썬에서 주어진 값을 합하는 부분 배열 찾기

분류에서Dev

합계가 주어진 값과 같은 모든 숫자 배열 요소 조합을 계산하는 방법은 무엇입니까?

분류에서Dev

주어진 백분위 수까지 변수의 누적 합계

분류에서Dev

주어진 값보다 작은 최대 부분 집합 합계

분류에서Dev

누적 값을 계산하기 위해 분할에 대한 합계 사용

분류에서Dev

모든 항목의 합계가 주어진 정수와 같은 배열 내부의 모든 조합 가져 오기

분류에서Dev

Cython은 numpy 배열 합계의 중요한 부분을 최적화합니다.

분류에서Dev

JavaScript : 배열에서 가장 높은 합계 값을 가진 객체 찾기

분류에서Dev

배열에 es6-arrow 함수 구문을 사용하여 주어진 값과 합계가 같은 두 항목이 있는지 확인하십시오.

분류에서Dev

주어진 열 값의 합계 계산

분류에서Dev

정렬되지 않은 숫자 배열에서 주어진 합계를 가진 모든 쌍을 찾습니다.

분류에서Dev

동일한 ID를 가진 열에있는 값의 누적 합계

분류에서Dev

mySQL은 결과 배열의 첫 번째 요소가 주어진 값과 같은지 결정합니다.

분류에서Dev

n 개의 정수 목록이 주어지면 합계가 x보다 크거나 같은 최소 카디널리티 부분 집합을 찾습니다.

분류에서Dev

집합을 n 개의 같지 않은 부분 집합으로 분할하고, 주요 결정 요소는 부분 집합의 요소가 집계되어 미리 결정된 양과 같다는 것입니까?

분류에서Dev

합이 주어진 행과 같은 행렬에서 일부 행을 찾는 알고리즘

분류에서Dev

주어진 합계와 같은 양수와 음수의 가능한 모든 조합 찾기

분류에서Dev

동적 배열 / 범위 내에서 부분 합계 계산

분류에서Dev

동적 배열 / 범위 내에서 부분 합계 계산

분류에서Dev

이진 트리와 합계가 주어지면 경로를 따라 모든 값을 더한 값이 주어진 합계와 같도록 트리에 루트-리프 경로가 있는지 확인합니다.

분류에서Dev

이진 트리와 합계가 주어지면 경로를 따라 모든 값을 더한 값이 주어진 합계와 같도록 트리에 루트-리프 경로가 있는지 확인합니다.

분류에서Dev

특정 열 값을 기반으로 한 누적 합계

분류에서Dev

Excel, 다른 열의 해당 행이 값과 같은 한 열의 합계 계산

분류에서Dev

주어진 값과 일치하기 위해 배열 내에서 값의 가장 큰 부분 결정

분류에서Dev

인덱스에 대한 제약 조건이 주어진 최대 합계 부분 배열

분류에서Dev

배열을 거의 같은 합의 덩어리로 나누기

분류에서Dev

알고리즘이 스택을 사용하여 정확한 합계를 가진 부분 집합을 찾지 못하는 경우 대상에 가장 가까운 값을 가진 부분 집합 찾기

분류에서Dev

첫 번째 값을 제외한 이전 값의 누적 합계 가져 오기

Related 관련 기사

  1. 1

    주어진 합계로 부분 배열 찾기

  2. 2

    파이썬에서 주어진 값을 합하는 부분 배열 찾기

  3. 3

    합계가 주어진 값과 같은 모든 숫자 배열 요소 조합을 계산하는 방법은 무엇입니까?

  4. 4

    주어진 백분위 수까지 변수의 누적 합계

  5. 5

    주어진 값보다 작은 최대 부분 집합 합계

  6. 6

    누적 값을 계산하기 위해 분할에 대한 합계 사용

  7. 7

    모든 항목의 합계가 주어진 정수와 같은 배열 내부의 모든 조합 가져 오기

  8. 8

    Cython은 numpy 배열 합계의 중요한 부분을 최적화합니다.

  9. 9

    JavaScript : 배열에서 가장 높은 합계 값을 가진 객체 찾기

  10. 10

    배열에 es6-arrow 함수 구문을 사용하여 주어진 값과 합계가 같은 두 항목이 있는지 확인하십시오.

  11. 11

    주어진 열 값의 합계 계산

  12. 12

    정렬되지 않은 숫자 배열에서 주어진 합계를 가진 모든 쌍을 찾습니다.

  13. 13

    동일한 ID를 가진 열에있는 값의 누적 합계

  14. 14

    mySQL은 결과 배열의 첫 번째 요소가 주어진 값과 같은지 결정합니다.

  15. 15

    n 개의 정수 목록이 주어지면 합계가 x보다 크거나 같은 최소 카디널리티 부분 집합을 찾습니다.

  16. 16

    집합을 n 개의 같지 않은 부분 집합으로 분할하고, 주요 결정 요소는 부분 집합의 요소가 집계되어 미리 결정된 양과 같다는 것입니까?

  17. 17

    합이 주어진 행과 같은 행렬에서 일부 행을 찾는 알고리즘

  18. 18

    주어진 합계와 같은 양수와 음수의 가능한 모든 조합 찾기

  19. 19

    동적 배열 / 범위 내에서 부분 합계 계산

  20. 20

    동적 배열 / 범위 내에서 부분 합계 계산

  21. 21

    이진 트리와 합계가 주어지면 경로를 따라 모든 값을 더한 값이 주어진 합계와 같도록 트리에 루트-리프 경로가 있는지 확인합니다.

  22. 22

    이진 트리와 합계가 주어지면 경로를 따라 모든 값을 더한 값이 주어진 합계와 같도록 트리에 루트-리프 경로가 있는지 확인합니다.

  23. 23

    특정 열 값을 기반으로 한 누적 합계

  24. 24

    Excel, 다른 열의 해당 행이 값과 같은 한 열의 합계 계산

  25. 25

    주어진 값과 일치하기 위해 배열 내에서 값의 가장 큰 부분 결정

  26. 26

    인덱스에 대한 제약 조건이 주어진 최대 합계 부분 배열

  27. 27

    배열을 거의 같은 합의 덩어리로 나누기

  28. 28

    알고리즘이 스택을 사용하여 정확한 합계를 가진 부분 집합을 찾지 못하는 경우 대상에 가장 가까운 값을 가진 부분 집합 찾기

  29. 29

    첫 번째 값을 제외한 이전 값의 누적 합계 가져 오기

뜨겁다태그

보관