题目链接
英文链接:https://leetcode.com/problems/split-array-largest-sum/
中文链接:https://leetcode-cn.com/problems/split-array-largest-sum/
题目详述
给定一个非负整数数组和一个整数 m,你需要将这个数组分成 m 个非空的连续子数组。设计一个算法使得这 m 个子数组各自和的最大值最小。
注意:
数组长度 n 满足以下条件:
- 1 ≤ n ≤ 1000
- 1 ≤ m ≤ min(50, n)
示例:
1 | 输入: |
题目详解
- 如果给定子数组和的上限
cap
满足则要求,那么满足x >= cap
的x
均满足要求,即在这一条件上,具有有界性,可以运用二分查找,查找第一个满足要求的cap
。 - 对于每一个
cap
,遍历数组,统计子数组之和小于等于容量cap
的数组个数。- 如果它小于等于
m
,说明用cap
能进行分割,r = mid
。 - 如果它大于
m
,说明不用cap
能进行分割,l = mid + 1
。
- 如果它小于等于
- 初始的上界和下界分别为
sum
、max
。其中sum
代表数组元素和,即分割为 1 个数组(自身),max
代表数组元素最大值,即分割为单个元素。 - 注意为了防止溢出,数组元素和相关变量为
long
类型。 - 时间复杂度为
O(nlog(sum))
,其中sum
为数组元素和。
1 | public class LeetCode_00410 { |