【问题标题】:find minimum initial value, such that sum is always 1 or greater找到最小初始值,使得总和始终为 1 或更大
【发布时间】:2020-12-01 19:51:18
【问题描述】:

给定一个整数数组,从最小的数X开始,使得数组元素与X相加,总和总是大于等于1

如果给定数组是{-2, 3, 1, -5} 例如,在上面的数组中,X应该是4

解释:如果,我们从 4 开始,然后加上第一个数字 -2,数组和变为 4 + (-2) = 2(即 >0)现在将下一个元素 3 添加到当前和即 2, 2+ 3 = 5 (>0) 将下一个元素 1 添加到新的总和 5 得到,5 + 1 = 6 (>0) 将最后一个元素 -5 添加到新的总和 6 得到 6 + (-5) = 1,即再次大于零。

这是我目前的代码,但它不起作用:

function minX(arr) {
    var sum = 0
    var runningSum= 0
    for (var i=0; i < arr.length; i++){
        if ((arr[i] + sum) <= 1){
            var diff = arr[i] + sum
            var someNumber = 1 - diff
            sum = someNumber + sum

        }
        runningSum += arr[i]
    }
  return sum
}

【问题讨论】:

    标签: javascript arrays algorithm sum


    【解决方案1】:

    首先遍历数组,同时跟踪目前找到的最低总和。最后,结果是这样的数字,将其添加到找到的最小总和结果为 1:

    const minX = (arr) => {
      let recordMin = 0;
      let sum = 0;
      for (const elm of arr) {
        sum += elm;
        recordMin = Math.min(recordMin, sum);
      }
      return -recordMin + 1;
    };
    
    console.log(minX([-2, 3, 1, -5]));
    console.log(minX([-2, 3, 1, -5, 999]));

    【讨论】:

    • 我明白了,为什么最后需要在recordMin前面的(-)?
    • 因为要求解的方程是recordMin + result = 1,所以你得到result = 1 - recordMin - 或result = -recordMin + 1
    【解决方案2】:

    获取数组元素的总和,例如使用Array.prototype.reduce

    arr.reduce((a, b) => a + b, 0);
    

    然后,否定它并加1。所以,所有在一起:

    function minX(arr) {
        return -arr.reduce((a, b) => a + b, 0) + 1;
    }
    

    或者,为了简化:

    function minX(arr) {
        return arr.reduce((a, b) => a - b, 1);
    }
    

    【讨论】:

    • 我认为一个简单的总和是不够的。举个例子,[-2, 3, 1, -5, 999] - 输出需要是 4,而不是 -995。
    • @CertainPerformance 如果我正确理解了问题,它可以工作。函数返回 -995,-995 - 2 + 3 + 1 -5 + 999 等于 1。为什么是 4? -995
    • OP 希望确保迭代数组时任意点的累积总和不小于 1 - 而不仅仅是迭代后的最终累积总和。
    【解决方案3】:

    您可以获取想要的结果并减去数组的所有值。

    function minX(array) {
        return array.reduce((s, v) => s - v, 1);
    }
    
    console.log(minX([-2, 3, 1, -5])); // 4

    【讨论】:

    • 我认为一个简单的总和是不够的。例如,[-2, 3, 1, -5, 999] - 输出需要为 4,而不是 -995。
    猜你喜欢
    • 2018-10-16
    • 1970-01-01
    • 2010-12-29
    • 1970-01-01
    • 2012-12-03
    • 1970-01-01
    • 1970-01-01
    • 2018-04-14
    • 1970-01-01
    相关资源
    最近更新 更多