方法一 个人方法:
找出数组求和过程中出现的最小值,如果这个值最小都>=0,那么startValue只需要取最小正数1,
反之startValue取最小值的绝对值+1,那么startValue+min一定>=1
var minStartValue = function(nums) {
let count=0,min=9999
for(let num of nums){
count+=num
if(count<min){
min=count
}
}
return min>0?1:Math.abs(min)+1
};
消耗时间和内存情况:
方法二 二分查找
当 nums所有元素均为非负数时,可以直接返回 1。
当有负数时:如果一个数满足startValue的要求,那么比他大的数也满足,比他小的数则不一定满足。对于边界[left,right]以及中间值medium,如果medium满足startValue的条件,那么[medium,rigth]都能满足,medium作为新的右边界,去找更小的能满足startValue的值,如果medium不满足,那么[left,medium]里的值都不会满足,把medium作为新的左边界,去[medium,right]去找满足startValue的值,以此循环直到找到最小的满足值
左边界可以选1,右边界选数组最小的值的绝对值乘以数组长度,startValue一定不会超过这个范围
var minStartValue = function(nums) {
const m = _.min(nums);
if (m >= 0) {
return 1;
}
let left = 1, right = -m * nums.length + 1;
while (left < right) {
const medium = Math.floor((left + right) / 2);
if (valid(medium, nums)) {
right = medium;
} else {
left = medium + 1;
}
}
return left;
};
const valid = (startValue, nums) => {
for (const num of nums) {
startValue += num;
if (startValue <= 0) {
return false;
}
}
return true;
}
消耗时间和内存情况: