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 }