# LC410 - Split Array Largest Sum
## 线性关系 二分查找猜答案
```java=
class Solution {
/*
x: The sum of sub-array
f(x): If the sum of sub-array is x, it can split f(x) sub-arrays.
*/
public int splitArray(int[] nums, int m) {
int length = nums.length;
int minSum = 0; // the max element of array
int maxSum = 0; // the sum of array
for (int num : nums) {
minSum = Math.max(minSum, num);
maxSum += num;
}
while (minSum + 1 < maxSum) {
int midSum = minSum + (maxSum - minSum) / 2;
if (canSplitSubArrayBy(midSum, m, nums)) {
maxSum = midSum;
} else {
minSum = midSum;
}
}
// minimum
if (canSplitSubArrayBy(minSum, m, nums)) {
return minSum;
}
if (canSplitSubArrayBy(maxSum, m, nums)) {
return maxSum;
}
return -1;
}
// inverse function
private boolean canSplitSubArrayBy(int targetSum, int targetNumSubArray, int[] nums) {
int length = nums.length;
int numSubArray = 0;
int sumSubArray = 0;
for (int i = 0; i < length; i++) {
sumSubArray += nums[i];
if (sumSubArray == targetSum) {
numSubArray++;
sumSubArray = 0;
} else if (sumSubArray > targetSum) {
numSubArray++;
sumSubArray = nums[i];
}
}
if (sumSubArray != 0) {
numSubArray++;
}
return numSubArray <= targetNumSubArray;
}
}
```