class Solution {
// Check if array can be split into <= m subarrays with max sum <= mid
canSplit(nums, m, mid) {
let count = 1;
let currentSum = 0;
for (const num of nums) {
if (currentSum + num <= mid) {
currentSum += num; // add to current subarray
} else {
count++; // start new subarray
currentSum = num;
if (count > m) return false; // too many subarrays
}
}
return true;
}
splitArray(nums, m) {
let low = Math.max(...nums); // minimum possible max sum
let high = nums.reduce((a, b) => a + b, 0); // maximum possible max sum
while (low < high) {
const mid = Math.floor((low + high) / 2);
if (this.canSplit(nums, m, mid)) {
high = mid; // try smaller max sum
} else {
low = mid + 1; // increase max sum
}
}
return low;
}
}
// Driver code
const sol = new Solution();
const nums = [7, 2, 5, 10, 8];
const m = 2;
const result = sol.splitArray(nums, m);
console.log(result);if (currentSum + num <= mid) { currentSum += num; } else { count++; currentSum = num; if (count > m) return false; }
Check if current number fits in current subarray or start new subarray; fail if too many subarrays
while (low < high) { const mid = Math.floor((low + high) / 2); if (this.canSplit(nums, m, mid)) { high = mid; } else { low = mid + 1; } }
Binary search on answer range, narrowing down to minimum valid max sum