|
@@ -0,0 +1,38 @@
|
|
|
+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
|
|
|
+}
|