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

123456789101112131415161718192021222324252627282930313233343536373839404142
  1. func splitArray(nums []int, m int) int {
  2. if len(nums) == 0 {
  3. return 0
  4. }
  5. l, r := nums[0], 0 // max, sum
  6. for _, i := range nums {
  7. l = maxInt(l, i)
  8. r += i
  9. }
  10. for l <= r {
  11. mid := l + (r-l)/2
  12. if isValid(nums, m, mid) { // res <= mid, mid is big enough
  13. r = mid - 1
  14. } else { // mid < res
  15. l = mid + 1
  16. }
  17. }
  18. return l
  19. }
  20. func isValid(nums []int, m, max int) bool {
  21. cnt, sum := 1, 0
  22. for _, i := range nums {
  23. if max < sum+i {
  24. sum = i
  25. cnt++
  26. if m < cnt {
  27. return false
  28. }
  29. } else {
  30. sum += i
  31. }
  32. }
  33. return true
  34. }
  35. func maxInt(x, y int) int {
  36. if x < y {
  37. return y
  38. }
  39. return x
  40. }