https://leetcode.com/problems/minimum-value-to-get-positive-step-by-step-sum/description/

class Solution {
public int minStartValue(int[] nums) {
// prefix sum을 구하고, 거기서 가장 작은값을 구하자.
// 그럼 걔를 더해줬을 때 (거기까지 진행했을 때) 1이상 이어야 하니까,
// (가장 작은값일 때 만족하는 숫자라면, 나머지는 더 큰 값이므로, 더해줘도 무조건 1이상임)
// answer + min >= 1
// answer >= 1 - min
// asnwer의 최소값은 1 - min이 된다.
int answer = 0;
int[] prefix = new int[nums.length];
prefix[0] = nums[0];
int min = prefix[0];
for(int i = 1; i < nums.length; i++ ) {
prefix[i] = prefix[i-1] + nums[i];
min = Math.min(min, prefix[i]);
}
// min값이 양수라면 무조건 1이 정답
if(min > 0) {
answer = 1;
return answer;;
}
answer = 1 -min;
return answer;
}
}
=> prefix sum 배열을 어차피 한번만 사용하므로, 굳이 배열을 만들지 않고 반복문 내에서 해결할 수 있다.
class Solution {
public int minStartValue(int[] nums) {
int min = Integer.MAX_VALUE;
int sum = 0;
for(int i = 0; i < nums.length; i++ ) {
sum += nums[i]; // 공간 복잡도 O(1)으로 누적합 구하기
min = Math.min(min, sum);
}
// min값이 양수라면 무조건 1이 정답 (1로 안내려가니까)
if(min > 0) {
return 1;
}
return 1 - min ;
}
}