https://leetcode.cn/problems/split-array-largest-sum/
给定一个非负整数数组 nums 和一个整数 k ,你需要将这个数组分成 k 个非空的连续子数组。
设计一个算法使得这 k 个子数组各自和的最大值最小。
示例 1:
输入:nums = [7,2,5,10,8], k = 2
输出:18
解释:
一共有四种方法将 nums 分割为 2 个子数组。
其中最好的方式是将其分为 [7,2,5] 和 [10,8] 。
因为此时这两个子数组各自的和的最大值为18,在所有情况中最小。
class Solution:
def splitArray(self, nums: List[int], k: int) -> int:
# threshold:数组和的阈值
# sums:数组和,和阈值threshold比较
# cnt:数组个数,和k比较
def func(threshold):
sums, cnt = 0, 1
for num in nums:
if sums + num > threshold:
cnt += 1
sums = num
else:
sums += num
return cnt <= k
left, right = max(nums), sum(nums)
while left <= right:
mid = left + (right - left) // 2
# cnt没有超过k,说明分割数组中数字可能过多,右边界左移
if func(mid):
right = mid - 1
# cnt超过k,说明分割数组中数字可能过少,导致小数组个数过多,左边界右移
else:
left = mid + 1
return left