题目描述:
Given an array 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.
Note:
If n is the length of array, assume the following constraints are satisfied:
- 1 ≤ n ≤ 1000
- 1 ≤ m ≤ min(50, n)
Examples:
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.
class Solution {
public:
int splitArray(vector<int>& nums, int m) {
long long left=INT_MIN;
long long right=0;
for(int num:nums)
{
left=max(left,(long long)num);
right+=num;
}
// 思路是二分结果,根据最少可分的子数组数,确定搜索方向
// 每个子数组和都要小于或等于mid,用贪心的方法求出最少需要分成几份
while(left<right)
{
long long mid=(left+right)/2;
int count=count_subarray(nums,mid);
// 必须把数组分成大于m份,说明mid过小
if(count>m) left=mid+1;
else right=mid;
}
return left;
}
int count_subarray(vector<int>& nums, int target)
{
int count=1; // 注意count从1开始
long long sum=0;
for(int i=0;i<nums.size();i++)
{
if(sum+nums[i]>target)
{
sum=0;
count++;
}
sum+=nums[i];
}
return count;
}
};
本文介绍了一种算法,用于将数组分割成m个连续子数组,以最小化这些子数组的最大和。通过二分查找和贪心策略,该算法有效地解决了问题。示例中,数组[7,2,5,10,8]被分为[7,2,5]和[10,8],最大和为18。
773

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



