https://leetcode.com/problems/count-the-hidden-sequences/description/
어떤 수열에 대해서 각 항의 차를 저장한 수열이 제공되고, 수열이 가질 수 있는 최솟값과 최댓값이 주어진다. 그래서 해당 조건을 만족하는 수열이 몇 가지 있을 수 있는지 구하는 문제이다.
접근은 첫 항을 i로 두고 i를 기준으로 해서 나머지 항이 어떻게 되는지 계산할 수 있도록 차가 저장된 배열 differences를 누적합 시켰다.
그러고 누적합이 저장된 배열의 최솟값과 최댓값을 뽑아낸 후 조건에 주어진 lower와 upper 즉 수열이 가질 수 있는 최솟값과 최댓값을 비교하면서 첫 항이 될 수 있는 수의 범위를 구하고 그 범위의 크기를 반환했다.
class Solution:
def numberOfArrays(self, differences: List[int], lower: int, upper: int) -> int:
sumDif = [0] * len(differences)
sumDif[0] = differences[0]
for i in range(1, len(differences)):
sumDif[i] = sumDif[i-1] + differences[i]
minV = min(sumDif)
maxV = max(sumDif)
start = lower - minV
end = upper - maxV
return end - start + 1 if end > start else 0
그리고 틀렸다.
difference가 [-40]으로 주어지고, lower는 -46, upper는 53이 주어졌을 때 구해야하는 답은 60인데 내 코드는 100을 반환했다. 근데 생각해보니까 항이 1개이면 lower와 upper사이 범위 전부 다 가능할텐데 그래서 100이 맞아야할 것 같은데 왜 아닌지 모르겠다.
일단 코드는
class Solution:
def numberOfArrays(self, differences: List[int], lower: int, upper: int) -> int:
sumDif = 0
minV = 0
maxV = 0
for d in differences:
sumDif += d
minV = min(minV, sumDif)
maxV = max(maxV, sumDif)
start = lower - minV
end = upper - maxV
return end - start + 1 if end >= start else 0
이렇게 수정했고 통과는 했는데 왜 이렇게 돼야하는지는 아직 이해를 못했다.