题目大意:把数组w分成d份,每一份求和并求出和的最大值,返回值为最小的和值。
解法:与leetcode 410的解法一样。
思路:
(1)和值的取值范围为[w的最大值,w的所有元素的和],该范围是闭区间;
(2)这个范围是给连续递增区间,那么可以采用二分查找来确定;
(3)二分的条件:如果按照当前取值,得到的分组数量大于d,那么说明取值小了,需要提高取值,反之,降低取值。
代码如下:
class Solution {
public:
int shipWithinDays(vector<int>& w, int d) {
int sum=0;
int max=w[0];
for(int i=0;i<w.size();i++)
{
sum+=w[i];
if(max<w[i])
{
max=w[i];
}
}//按照第1步,取[max,sum]区间
return search(w,d,max,sum);
}
int search(vector<int>& w, int d, int l, int h)//按照第2步,二分查找合适的取值
{
int mid;
while(l<h)
{
mid=(l+h)/2;
if(check(w,d,mid))
{
l=mid+1;
}else
{
h=mid;
}
}
return l;
}
bool check(vector<int>& w, int d,int aim)//按照第3步,看当前取值得到的分组数量并检验
{
int cd=0;
int cs=0;
for(int i=0;i<w.size();i++)
{
cs+=w[i];
if(cs>aim)
{
cs=w[i];
cd++;
}
}
cd++;
if(cd>d)
return true;
return false;
}
};