...
기본 개념 :
하는 경우 (정확성의 비공식적 증명) 숫자의 합 [a, b]
범위는 X
으로 나눌 수 있습니다.
적은 수학적 관점에서
(∑i=1 to a-1input[i]) % X = (∑i=1 to binput[i]) % X
:
the sum from the first element to b = the sum from the first element to a
+ the sum of the elements between the two
그래서 : 오른쪽에 그 금액이 모두 X
로 나눈 같은 나머지가있는 경우
the sum of the elements between the two = the sum from the first element to b
- the sum from the first element to a
그런 다음 나머지는 삭제됩니다 두 요소 사이의 요소 합계는 X
으로 나눌 수 있습니다. 정교 :
C = the sum of the elements between the two
B = the sum from the first element to b
A = the sum from the first element to a
이제 우리는
0 <= Q, S < X
으로 일부 정수
P
,
Q
,
R
및
S
에 대한 양식
RX + S
에 양식
PX + Q
및
A
에
B
을 변환 할 수 있습니다. 여기서, 정의에 의해,
Q
및
S
은 각각
B
및
A
의 나머지가
X
으로 나눠진다.
그런 다음 우리는이 :
C = (PX + Q) - (RX + S)
C = PX + Q - RX - S
C = PX - RX + Q - S
C = (P-R)X + Q - S
분명히 (P-R)X
은 (결과가 단순히 (P-R)
입니다) X
로 나눌 수 있습니다. 이제 Q - S
을 X
으로 나눌 수 있어야합니다. 그러나 0 <= Q, S < X
부터 동일해야합니다.
예 :
이 B = 13
, A = 7
, X = 3
을 보자.
여기 B % X = 1
및 A % X = 1
.
B
은 4*3 + 1
및 A
을 2*3 + 1
으로 다시 쓸 수 있습니다.
은 3
으로 나눌 수 있습니다.
높은 수준의 접근 방식 :
각 값은 배열의 처음부터 시작까지 추가 일부 지정된 위치에 끝낼 수있는 방법을 여러 가지 방법으로 표현 key -> value
의 해시 맵을 구축 sum mod X = key
(아래 예에서 "Mod 3"라인 및 맵 값 참조).
지금, 위의 논리에 따라, 우리는 두 개의 하위 어레이는 처음부터 시작하여 모두 같은 sum mod X
을 가진 각각의 위치 a
및 b
에서 끝나는 경우, 부분 배열 [a, b]
가 X
으로 나눌 수 것이라는 점을 알고있다.
따라서 해시지도의 각 값은 가능한 시작 및 끝점 집합의 크기를 나타내며 X
으로 나눌 수있는 부분 배열을 제공합니다 (모든 점은 시작 또는 끝 점이 될 수 있음).
시작 지점과 종료 지점을 선택할 수있는 방법의 수는 단순히
value choose 2 = value!/(2*(value-2)!)
(값이 1이면 0)입니다.
따라서 해시 맵의 각 값에 대해 계산하여 모두를 더해서 X
으로 나눌 수있는 하위 배열 수를 얻습니다.
알고리즘 :
지금까지 mod X
그 나머지 값이 표시되는 빈도의 수에 매핑 된 모든 숫자의 누적 합계를 저장하는 해시 맵을 구축는 (예상 O(n)
으로 구성).
0
의 값을 1 씩 늘립니다.이 값은 배열의 시작에 해당합니다.
카운트에
value!/(2*(value-2)!)
추가 해시 맵의 각 값에 대해 0
에 카운트를 초기화한다.
숫자가 원하는 값입니다.
실행 시간 :
O(n)
을 예상.
예 :
Input: 0 5 3 8 2 1
X = 3
Sum: 0 0 5 8 16 18 19
Mod 3: 0 0 2 2 1 0 1
Map:
0 -> 3
1 -> 2
2 -> 2
Count = 3!/2*(3-2)! = 3 +
2!/2*(2-2)! = 1 +
2!/2*(2-2)! = 1
= 5
하위 어레이는 다음과 같습니다
0 5 3 8 2 1
- 0 = 0 % 3 = 0
------------- 0 + 5 + 3 + 8 + 2 = 18 % 3 = 0
---------- 5 + 3 + 8 + 2 = 18 % 3 = 0
- 3 = 3 % 3 = 0
---- 2 + 1 = 3 % 3 = 0
작성한 코드의 문제점은 무엇입니까? –
당신의 솔루션은 가능한 많은 조합을 건너 뛴다 고 생각합니다. 인접한 요소의 합계를 여기에서 확인하십시오 (문제에서 "하위 배열"이 정의되지 않은 한). – Ashalynd
@Ahalynd "하위 배열"은 일반적으로 배열 (예 : [최대 부분 배열 문제] (http://en.wikipedia.org/wiki/Maximum_subarray_problem)). 비 연속적인 부분의 경우 일반적으로 "부분 집합"(예 : [부분 집합 합계 문제] (http://en.wikipedia.org/wiki/Subset_sum_problem))에 대해 이야기합니다. – Dukeling