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] <= 106
- 1 <= m <= min(50, nums.length)
首先我们能想到,最终答案的最大值就是整个nums的sum, 最小值则是sum / m和nums中的最大的元素相比较较大的那个。我们既然知道了取值范围,自然而然的就会想到用 binary search 的方法来查找这个值。剩下的看代码吧
impl Solution {
pub fn split_array(nums: Vec<i32>, m: i32) -> i32 {
let mut sum = 0;
let mut maximum = 0;
for i in 0..nums.len() {
sum += nums[i];
maximum = maximum.max(nums[i]);
}
let mut min = (sum / m).max(maximum);
let mut max = sum;
while min < max {
let mid = (min + max) / 2;
let mut count = 0;
let mut curr = 0;
for i in 0..nums.len() {
if curr + nums[i] > mid {
count += 1;
curr = nums[i];
} else {
curr += nums[i];
}
}
count += 1;
if count > m {
min = mid + 1;
} else {
max = mid;
}
}
min
}
}
本文介绍了一种使用二分搜索算法解决将数组分割为m个连续子数组,并使这些子数组中的最大和最小化的问题。通过确定搜索范围,即数组总和与数组中最大元素之间的值,可以有效地找到最优解。
773

被折叠的 条评论
为什么被折叠?



