题目链接
解题思路
题目的意思是从 startValue
开始依次加上 nums[i]
,过程中不能有小于 1
的值出现。
所以可以先创建一个用于记录前 i 项之和的数组容器 f
。其中,f[i] == f[i - 1] + nums[i]
, i = 0, 1, 2, ..., size - 1
(相当于 startValue
== 0)。并记录其中出现过的前 i 项的最小和。
vector<int> f(size); // f[i] == f[i - 1] + nums[i];
f[0] = nums[0]; // 初始状态
int minVal = f[0]; // 需要维护的值
for (int i = 1; i < size; i++) {
f[i] = nums[i] + f[i - 1];
minVal = min(minVal, f[i]);
}
得到最小前 i 项和之后,就可以进行判断:
- 如果
minVal
>= 1,说明,起始值为 0 时,已经满足条件,但题目要求选一个最小的正数作为返回值,所以返回 1。 - 如果
minVal
< 1,则说明,起始值为 0 时,已经不能满足条件,最小的满足要求便是1 - minVal
。
实现代码(C++)
class Solution {
public:
int minStartValue(vector<int>& nums) {
int size = nums.size();
vector<int> f(size); // f[i] == f[i - 1] + nums[i];
f[0] = nums[0]; // 初始状态
int minVal = f[0]; // 需要维护的值
for (int i = 1; i < size; i++) {
f[i] = nums[i] + f[i - 1];
minVal = min(minVal, f[i]);
}
if (minVal >= 1) { // 如果最小和大于或等于1,则直接返回1;
// 因为上面的f[0..size-1]相当于startVal == 0时的情况。
// 0满足,则 1 也必定能满足条件
return 1;
} else { // 否则,就差多少就补多少。
return 1 - minVal;
}
// return minVal >= 1 ? 1 : 1 - minVal;
}
};