---
# System prepended metadata

title: Split Array Largest Sum 410
tags: [hard, binarySearch, leetcode]

---


# Split Array Largest Sum 410

###### tags: `leetcode`,`binarySearch`,`hard`



>ref: https://leetcode.com/problems/split-array-largest-sum/
>
Given an array nums which consists of non-negative integers and an integer m, you can split the array into m non-empty continuous subarrays.

Write an algorithm to minimize the largest sum among these m subarrays.

 

>Example 1:
Input: nums = [7,2,5,10,8], m = 2
Output: 18
Explanation:
There are four ways to split nums into two subarrays.
The best way is to split it into [7,2,5] and [10,8],
where the largest sum among the two subarrays is only 18.

>Example 2:
Input: nums = [1,2,3,4,5], m = 2
Output: 9
 

>Constraints:
1 <= nums.length <= 1000
0 <= nums[i] <= 106
1 <= m <= min(50, nums.length)



>1.timeResolution:O(log N)\*O\(log(sum_of_array-max)\)

>2. DP待補 [DP](https://leetcode.com/problems/split-array-largest-sum/discuss/931979/Detailed-and-clean-O(n)-time-solution-with-NO-log(sum))

```java=
	public int splitArray(int[] nums, int m) {

		// boundary btw 1. the max in nums and 2. sum of nums
		int left = 0;
		int right = 0;

		for (int num : nums) {
			left = Math.max(left, num);
			right += num;
		}

		while (left < right) {

			int med = left + (right - left) / 2;

			int count = 1;

			int sum = 0;

			loop: for (int num : nums) {
				sum += num;
				if (sum > med) {
					count++;
					sum = num;
				}

				if (count > m) {
					break loop;
				}
			}

			if (count > m) {
				left = med + 1;
			} else {
				right = med; //med is examized.
			}

		}

		return left;

	}
```
    
    
    
