Split an array into exactly k contiguous subarrays, minimizing the largest subarray sum.
[7,2,5,10,8], k=2 → best split is [7,2,5]/[10,8], largest sum 18.
(LeetCode problem) —
identical shape to Allocate Books.
public class Solution { public int splitArray(int[] nums, int k) { int max = 0, sum = 0; for (int num : nums) { max = Math.max(max, num); sum += num; } int low = max, high = sum; int result = 0;
while (low <= high) { int mid = low + (high - low) / 2;
if (isFeasible(nums, k, mid)) { result = mid; high = mid - 1; // try a smaller maximum } else { low = mid + 1; // need a larger maximum } }
return result; }
private boolean isFeasible(int[] nums, int k, int maxSum) { int subarrays = 1; int currentSum = 0;
for (int num : nums) { if (currentSum + num > maxSum) { subarrays++; currentSum = num;
if (subarrays > k) { return false; } } else { currentSum += num; } }
return true; }}Time: O(n × log(sum - max)).