123456789101112131415161718192021222324252627282930313233343536373839404142 |
- func splitArray(nums []int, m int) int {
- if len(nums) == 0 {
- return 0
- }
- l, r := nums[0], 0 // max, sum
- for _, i := range nums {
- l = maxInt(l, i)
- r += i
- }
- for l <= r {
- mid := l + (r-l)/2
- if isValid(nums, m, mid) { // res <= mid, mid is big enough
- r = mid - 1
- } else { // mid < res
- l = mid + 1
- }
- }
- return l
- }
- func isValid(nums []int, m, max int) bool {
- cnt, sum := 1, 0
- for _, i := range nums {
- if max < sum+i {
- sum = i
- cnt++
- if m < cnt {
- return false
- }
- } else {
- sum += i
- }
- }
- return true
- }
- func maxInt(x, y int) int {
- if x < y {
- return y
- }
- return x
- }
|