JavaScript 中最大的子数组总和

问题

我们需要编写一个 JavaScript 函数,它接受一个非负整数数组 arr 作为第一个参数,一个整数 num (num < arr.length) 作为第二个参数。

我们函数的任务是将数组拆分为 num 个非空的连续子数组。应该以这样的方式拆分数组,以最小化这些 num 个子数组中的最大总和。然后我们的函数应该返回子数组中累积的最大和。

例如,如果函数的输入是 -

const arr = [5, 1, 4, 8, 7];

const num = 2;

那么输出应该是 -

const output = 15;

输出说明

虽然有四种方法可以将原始数组拆分为子数组,但是如果我们将数组拆分为两组 [5, 1, 4] 和 [8, 7],那么这两组将具有最小的和,并且这两组中较大的是8 + 7 = 15 我们的函数应该返回。

示例

此代码将是 -

const arr = [5, 1, 4, 8, 7];

const num = 2;

const splitArray = (arr = [], num = 1) => {

   let max = 0;

   let sum = 0;

   const split = (arr, mid) => {

      let part = 1;

      let tempSum = 0;

      for (let num of arr) {

         if (tempSum + num > mid) {

            tempSum = num;

            part++;

         } else {

            tempSum += num;

         }

      }

      return part;

   };

   for (let num of arr) {

      max = Math.max(max, num);

      sum += num;

   };

   let low = max;

   let high = sum;

   while (low < high) {

      let mid = Math.floor((high+low)/2);

      let part = split(arr, mid);

      if (part > num) {

         low = mid + 1;

      } else {

         high = mid;

      }

   }

   return low;

};

console.log(splitArray(arr, num));

代码说明:

我们在这里使用二分搜索来检查我们是否可以找到最佳分割。

输出结果

控制台中的输出将是 -

15

以上是 JavaScript 中最大的子数组总和 的全部内容, 来源链接: utcz.com/z/335592.html

回到顶部