前言
分割数组的最大值
给定一个非负整数数组 nums 和一个整数 m ,你需要将这个数组分成 m 个非空的连续子数组。
设计一个算法使得这 m 个子数组各自和的最大值最小。
示例 1:
输入:nums = [7,2,5,10,8], m = 2
输出:18
解释:
一共有四种方法将 nums 分割为 2 个子数组。
其中最好的方式是将其分为 [7,2,5] 和 [10,8] 。
因为此时这两个子数组各自的和的最大值为18,在所有情况中最小。
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/split-array-largest-sum
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
/**
* @param {number[]} nums
* @param {number} m
* @return {number}
*/
var splitArray = function(nums, m) {
let max = 0, sum = 0
for (let i = nums.length; i--;) {
max = Math.max(nums[i], max)
sum += nums[i]
}
let left = max, right = sum
while (left < right) {
// 子数组最大值
const mid = Math.floor(left + (right - left) / 2)
// 说明子数组最大值较小,需要增加mid的值,故left需右移
if (splits(nums, mid) > m) {
left = mid + 1
} else {
right = mid
}
}
return right
};
/**
* 切割数组数
* @param {number[]} nums
* @param {number} mid
*/
var splits = function(nums, mid) {
let split = 1, c = 0
for (let i = 0; i < nums.length; i++) {
// 当前子数组和大于子数组最大值,切割数组数+1
if (c + nums[i] > mid) {
c = 0
split++
}
c += nums[i]
}
return split
}
总结
二分查找的具体应用