410.split-array-largest-sum.go 793 B

1234567891011121314151617181920212223242526272829303132333435363738
  1. func splitArray(nums []int, m int) int {
  2. n := len(nums)
  3. sum := make([]int, n+1)
  4. for i := 0; i < n; i++ {
  5. sum[i+1] += nums[i] + sum[i]
  6. }
  7. if m == 1 {
  8. return sum[n]
  9. }
  10. beg, max, target := 0, sum[n]/m, sum[n]/m
  11. for i := 0; i < m-1; i++ { // Cut m-1 times
  12. l, r := beg, n
  13. for l <= r {
  14. mid := l + (r-l)/2
  15. if target < sum[mid]-sum[beg] {
  16. r = mid - 1 // Keep sum[r] - sum[beg] <= target
  17. } else {
  18. l = mid + 1
  19. }
  20. }
  21. if val := sum[r] - sum[beg]; val != target && sum[r+1]-sum[beg]-target < target-val {
  22. r++
  23. }
  24. max = maxInt(max, sum[r]-sum[beg])
  25. beg = r
  26. target = (sum[n] - sum[beg]) / (m - 1 - i)
  27. fmt.Println(r)
  28. }
  29. fmt.Println(sum, beg, max, target)
  30. return maxInt(max, sum[n]-sum[beg])
  31. }
  32. func maxInt(x, y int) int {
  33. if x < y {
  34. return y
  35. }
  36. return x
  37. }