Skip to content

410. Split Array Largest Sum

Description

Given an integer array nums and an integer k, split nums into k non-empty subarrays such that the largest sum of any subarray is minimized.

Return the minimized largest sum of the split.

A subarray is a contiguous part of the array.

 

Example 1:

Input: nums = [7,2,5,10,8], k = 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], k = 2
Output: 9
Explanation: There are four ways to split nums into two subarrays.
The best way is to split it into [1,2,3] and [4,5], where the largest sum among the two subarrays is only 9.

 

Constraints:

  • 1 <= nums.length <= 1000
  • 0 <= nums[i] <= 106
  • 1 <= k <= min(50, nums.length)

 

Solutions

Solution: Binary Search

  • Time complexity: O(nlogSum)
  • Space complexity: O(1)

 

JavaScript

js
/**
 * @param {number[]} nums
 * @param {number} k
 * @return {number}
 */
const splitArray = function (nums, k) {
  let left = Math.max(...nums);
  let right = nums.reduce((sum, num) => sum + num);

  const isValidSplit = averageAssign => {
    let current = 0;
    let count = 1;

    for (const num of nums) {
      current += num;
      if (current <= averageAssign) continue;
      count += 1;
      if (count > k) return false;
      current = num;
    }
    return true;
  };

  while (left < right) {
    const mid = Math.floor((left + right) / 2);

    isValidSplit(mid) ? (right = mid) : (left = mid + 1);
  }
  return left;
};

Released under the MIT license