1234567891011121314151617181920212223242526272829303132333435363738 |
- 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 m == 1 {
- return sum[n]
- }
- 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
- }
- }
- if val := sum[r] - sum[beg]; val != target && sum[r+1]-sum[beg]-target < target-val {
- r++
- }
- 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])
- }
- func maxInt(x, y int) int {
- if x < y {
- return y
- }
- return x
- }
|