每日一题——LeetCode1413.逐步求和得到正数的最小值

每日一题——LeetCode1413.逐步求和得到正数的最小值_第1张图片

 

方法一 个人方法:

找出数组求和过程中出现的最小值,如果这个值最小都>=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(count0?1:Math.abs(min)+1
};

消耗时间和内存情况:

每日一题——LeetCode1413.逐步求和得到正数的最小值_第2张图片

方法二 二分查找

当 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;
}

消耗时间和内存情况:

每日一题——LeetCode1413.逐步求和得到正数的最小值_第3张图片

 

你可能感兴趣的:(每日一题,javascript,leetcode,算法)