1. 程式人生 > 實用技巧 >leetcode - 分割陣列的最大值

leetcode - 分割陣列的最大值

題目描述

給定一個非負整數陣列和一個整數 m,你需要將這個陣列分成 m 個非空的連續子陣列。設計一個演算法使得這 m 個子陣列各自和的最大值最小。

注意:
陣列長度 n 滿足以下條件:

1 ≤ n ≤ 1000
1 ≤ m ≤ min(50, n)

示例

輸入:
nums = [7,2,5,10,8]
m = 2

輸出:
18

解釋:
一共有四種方法將nums分割為2個子陣列。
其中最好的方式是將其分為[7,2,5] 和 [10,8],
因為此時這兩個子陣列各自的和的最大值為18,在所有情況中最小。

題解

第一點,被分成的m個子陣列的最大值必在nums的最大值和nums的元素之和之中。第二點,弱弱地猜猜看,拿所在區間範圍的中間值去套,看看其能夠得到多少個子區間數,如果說所得到的子區間數偏大於m,說明你劃分的太小了,令左區間等於中間值加1,反之相反。

/**
 * @param {number[]} nums
 * @param {number} m
 * @return {number}
 */
var splitArray = function(nums, m) {
  var left = Math.max(...nums);
  var right = nums.reduce((pre, cur) => pre + cur);
  if (nums.length === m) {
    return left;
  }
  if (m === 1) {
    return right;
  }

  while(left < right) {
    var mid = (left + right) >> 1;
    var cnt = 1;
    var sum = 0;
    for (const val of nums) {
      if (sum + val > mid) {
        sum = 0;
        cnt++;
      }
      sum += val;
    }
    if (cnt > m) {
      left = mid + 1;
    } else {
      right = mid;
    }
  } 
  return left;
};

程式碼地址: https://zhengjiangtao.cn/coding/interview/split_array.js

專案地址: https://zhengjiangtao.cn/coding/interview/split_array.js

參考文獻

  1. 分割陣列的最大值(leetcode) :https://leetcode-cn.com/problems/split-array-largest-sum


本作品採用知識共享署名-非商業性使用-相同方式共享 4.0 國際許可協議進行許可。