410 Split Array Largest Sum
Last updated
Last updated
class Solution {
public int splitArray(int[] nums, int m) {
int[] prefixSum = new int[nums.length + 1];
for (int i = 0; i < nums.length; ++i) {
prefixSum[i + 1] = prefixSum[i] + nums[i];
}
int[][] dp = new int[m + 1][nums.length + 1];
for (int i = 1; i < nums.length + 1; ++i) {
dp[1][i] = prefixSum[i];
}
for (int i = 2; i <= m; ++i) {
for (int j = 1; j <= nums.length; ++j) {
int minSum = Integer.MAX_VALUE;
for (int k = 1; k < j; ++k) {
minSum = Math.min(minSum, Math.max(dp[i - 1][k], prefixSum[j] - prefixSum[k]));
}
dp[i][j] = minSum;
}
}
return dp[m][nums.length];
}
} class Solution {
public int splitArray(int[] nums, int m) {
int sum = 0, max = 0;
for (int n : nums) {
sum += n;
max = Math.max(max, n);
}
int left = max, right = sum;
while (left + 1 < right) {
int mid = left + (right - left) / 2;
if (canSplit(nums, m, mid)) {
right = mid;
} else {
left = mid;
}
}
if (canSplit(nums, m, left)) return left;
else return right;
}
private boolean canSplit(int[] nums, int m, int maxSum) {
int sum = 0;
for (int i = 0; i < nums.length; ++i) {
sum += nums[i];
if (sum > maxSum) {
sum = nums[i];
m--;
}
if (m == 0) return false;
}
return true;
}
}