Leetcode Java Count the Hidden Sequences
업데이트:
문제
코드
class Solution {
public int numberOfArrays(int[] differences, int lower, int upper) {
long sum = 0;
long max = 0;
long min = 0;
for (int difference : differences) {
sum += difference;
max = Math.max(max, sum);
min = Math.min(min, sum);
}
return (int) Math.max(0, (upper - lower) - (max - min) + 1);
}
}
결과
설명
- 아래의 규칙을 만족하는 정수 배열인 differences를 이용하여 [lower, upper] 범위 내 만족하는 조합의 수를 구하는 문제이다.
- hidden은 숨겨진 조합으로, 인접한 두 값의 차이가 differences 배열이 된다.
- 즉, $differences[i] = hidden[i + 1] - hidden[i]$를 만족한다.
- 문제 풀이에 필요한 변수를 정의한다.
- sum은 differences 내 값들의 합계를 구하기 위한 변수로, 합계가 매우 클 수 있으므로 long 타입의 0으로 초기화한다.
- max와 min은 누계된 값들 중 최댓값과 최솟값을 저장하기 위한 변수로, sum과 동일하게 long 타입의 0으로 초기화한다.
- differences의 값들을 순차적으로 difference에 넣어 아래를 수행한다.
- sum에 difference의 값을 누계한다.
- max 와 min에 자기 자신과 sum 중 최댓값과 최솟값을 넣어준다.
- 반복이 완료되면 0과 $(upper - lower) - (max - min) + 1$인 [lower, upper] 범위 내 만족하는 조합의 수를 주어진 문제의 결과로 반환한다.
해설
- 누계된 값들을 이용한 max와 min의 차잇값은 범위 내 최대 폭을 나타내므로, [lower, upper] 범위에서는 아래와 같은 계산식이 성립한다.
- $upper - lower < max - min$의 경우, [lower, upper] 범위 내 hidden 배열은 존재하지 않는다.
- $upper - lower = max - min$의 경우, [lower, upper] 범위 내 hidden 배열이 한 개만 존재한다.
- 위의 공식을 반복하여 $upper - lower = max - min + n$의 경우, [lower, upper] 범위 내 hidden 배열이 $n + 1$ 개가 존재한다.
소스
Sample Code는 여기에서 확인 가능합니다.
댓글남기기