leetcode:410. 分割数组的最大值(困难,二分,dp)--------二分的前期判断还是要好好想,可能有细微的错误。
程序员文章站
2022-03-16 11:22:39
...
题目:
分析:
菜呀,还是太菜,
最大值最小,这么敏感的二分提示字眼,自己的大脑竟然都没有察觉。
代码:道路曲折到怀疑模板,再重申一遍,模板是不容置疑的,有问题也是出在判断的过程上。:
class Solution {
public:
int splitArray(vector<int>& nums, int m) {
/*
nums.clear();
nums.push_back();
nums.push_back(4);
nums.push_back(4);
m=3;
*/
long long a=nums[0];
for(int i=0;i<nums.size();i++)
{
a=max(a,(long long)nums[i]);
}
long long b=accumulate(nums.begin(),nums.end(),0);
//sort(nums.begin(),nums.end());
while(a<=b)
{
long long c=a+(b-a)/2;//最多存放的数的和
long long all=1;
long long sum=0;
for(int i=0;i<nums.size();i++)
{
sum+=nums[i];
if(sum>c)
{
sum=nums[i];
all++;
}
}
//cout<<c<<' ';
if(all<=m)
{
b=c-1;
}
else{
a=c+1;
}
}
return a;
}
};
1.第一次,下界判断错误,比如说,这样的一个例子:
如果:
for(int i=0;i<nums.size();i++)
{
sum+=nums[i];
if(sum>c)
{
sum=nums[i];
all++;
}
}
还是这样的判断,那么1是可以满足的,因为一旦sum大于当前允许的最大容量,就会加1,即默认一定能放下一个,所以最小值边界应该设置为所有元素的最大值。