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;
}