题目地址:https://leetcode.cn/problems/split-array-largest-sum/description/
给定一个非负整数数组 nums 和一个整数 k ,你需要将这个数组分成 k 个非空的连续子数组,使得这 k 个子数组各自和的最大值 最小。
返回分割后最小的和的最大值。
子数组 是数组中连续的部份。
// 给定一个非负整数数组 nums 和一个整数 k ,你需要将这个数组分成 k 个非空的连续子数组,使得这 k 个子数组各自和的最大值 最小。
// 返回分割后最小的和的最大值。
// 左边界:数组最大值(每个元素都是一个子数组)
// 有边界:数组元素和(所有元素加起来是一个子数组)
func splitArray(nums []int, k int) int {
left := 0
right := 0
for _, n := range nums {
right += n
// left = max(left, n)
}
for left < right {
sum := left + (right-left)/2
if splitBinary(nums, k, sum) {
right = sum
} else {
left = sum + 1
}
}
return right
}
// 累加,直到刚好不超过 sum。算出最少要分成多少个子数组
// 如果子数组数量大于 k 说明 sum 定小了。往右边界二分
// 反之,往左边界二分
// 如果子数组数量小于等于 k 返回 true
func splitBinary(nums []int, k, sum int) bool {
cnt := 1
cur := 0
for i := 0; i < len(nums); i++ {
if cur+nums[i] <= sum {
cur += nums[i]
} else {
cnt++
cur = nums[i]
if cnt > k {
return false
}
}
}
return true
}
1424

被折叠的 条评论
为什么被折叠?



