Split Array Largest Sum
题意描述
给出一个长度为n的非负序列,需要将该序列分成m段,使得每段数字之和的最大值尽可能小。求这个最小值。
其中,1<=n<=1000,1<=m<=min(50,n)。
算法分析
- 二分答案。。。。。
时间复杂度:O(n*log(sum)) - DP
但DP的时间复杂度是O(m*n^2),虽然不超时,但很慢。
代码
class Solution {
public:
int splitArray(vector<int>& nums, int m) {
int n=nums.size();
if (n==0) return 0;
long long sum=0;
for (int i=0;i<n;i++)
sum+=nums[i];
long long l=0,r=sum;
while (l<r)
{
long long mid=(l+r)/2;
if (check(mid,nums,m)) r=mid;
else l=mid+1;
}
return r;
}
bool check(long long k,vector<int>& nums, int m)
{
int n=nums.size();
long long tmp=0;
int ans=1;
for (int i=0;i<n;i++)
if (nums[i]>k) return false;
else
{
if (nums[i]+tmp>k)
{
tmp=nums[i];
ans++;
}
else tmp+=nums[i];
}
if (ans<=m) return true;
else return false;
}
};