|  | @@ -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 {
 |