410. Split Array Largest Sum

Problem


Tags: Array, Binary Search, Dynamic Programming, Greedy

Given an array nums which consists of non-negative integers and an integer m, you can split the array into m non-empty continuous subarrays.

Write an algorithm to minimize the largest sum among these m subarrays.

Example 1:

Input: nums = [7,2,5,10,8], m = 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], m = 2
Output: 9

Example 3:

Input: nums = [1,4,4], m = 3
Output: 4

Constraints:

  • 1 <= nums.length <= 1000
  • 0 <= nums[i] <= 10^6
  • 1 <= m <= min(50, nums.length)

Code

C

// 410. Split Array Largest Sum (12/28/54214)
// Runtime: 0 ms (94.84%) Memory: 5.71 MB (59.35%) 

#define max(a, b) ((a) > (b) ? a : b)

int splitArray (int nums[], int nums_size, int m) {
    int left = INT32_MIN, right = 0;
    for (int i = 0; i < nums_size; i++) {
        left = max(left, nums[i]);
        right += nums[i];
    }
    
    int ans = 0;
    while (left <= right) {
        int largest_test = left + (right - left) / 2;
        
        int slices = 1, current = 0;
        for (int i = 0; i < nums_size; i++) {
            if (current + nums[i] <= largest_test) {
                current += nums[i];
            }
            else {
                current = nums[i];
                slices++;
            }
        }
        
        if (slices <= m) {
            right = largest_test - 1;
            ans = largest_test;
        }
        else {
            left = largest_test + 1;
        }
    }
    
    return ans;
}