|
@@ -1,33 +1,37 @@
|
|
|
func splitArray(nums []int, m int) int {
|
|
|
- n := len(nums)
|
|
|
- sum := make([]int, n+1)
|
|
|
- for i := 0; i < n; i++ {
|
|
|
- sum[i+1] += nums[i] + sum[i]
|
|
|
+ if len(nums) == 0 {
|
|
|
+ return 0
|
|
|
}
|
|
|
- if m == 1 {
|
|
|
- return sum[n]
|
|
|
+ l, r := nums[0], 0 // max, sum
|
|
|
+ for _, i := range nums {
|
|
|
+ l = maxInt(l, i)
|
|
|
+ r += i
|
|
|
}
|
|
|
- beg, max, target := 0, sum[n]/m, sum[n]/m
|
|
|
- for i := 0; i < m-1; i++ { // Cut m-1 times
|
|
|
- l, r := beg, n
|
|
|
- for l <= r {
|
|
|
- mid := l + (r-l)/2
|
|
|
- if target < sum[mid]-sum[beg] {
|
|
|
- r = mid - 1 // Keep sum[r] - sum[beg] <= target
|
|
|
- } else {
|
|
|
- l = mid + 1
|
|
|
- }
|
|
|
+ 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
|
|
|
}
|
|
|
- if val := sum[r] - sum[beg]; val != target && sum[r+1]-sum[beg]-target < target-val {
|
|
|
- r++
|
|
|
+ }
|
|
|
+ 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
|
|
|
}
|
|
|
- max = maxInt(max, sum[r]-sum[beg])
|
|
|
- beg = r
|
|
|
- target = (sum[n] - sum[beg]) / (m - 1 - i)
|
|
|
- fmt.Println(r)
|
|
|
}
|
|
|
- fmt.Println(sum, beg, max, target)
|
|
|
- return maxInt(max, sum[n]-sum[beg])
|
|
|
+ return true
|
|
|
}
|
|
|
|
|
|
func maxInt(x, y int) int {
|