思路:
利用二分查找
1假如bloomDay数组长度小于所需要的花的数量,那么一定不可以制作出要求的花束,return -1;反之,只要天数足够长,一定可以制作出要求的花束。我们要找到最短需要的天数。
2设置一个最短天数low,初始化为1,最长天数high,初始化为bloomDay中的最长开花时间。
利用二分查找,循环条件low<high,当low=high的时候跳出循环。定义low和high的中值是当前天数days,假如days天可以制作出m束花(这里用到辅助函数来判断),high=days,假如不可以,说明天数不够,days+1,直到low==high。
辅助函数help,具体实现见注释。
class Solution {
public:
int minDays(vector<int>& bloomDay, int m, int k) {
int len=bloomDay.size();
//假如需要的花的数量大于花园中花的数量,return -1
if(m*k>len)
return -1;
//最少天数和最大天数
int low=1,high=1;
for(int i=0;i<len;++i){
high=max(high,bloomDay[i]);
}
//利用二分查找找到最少天数
while(low<high){
int days=low+(high-low)/2;
if(help(bloomDay,days,m,k)) //辅助函数,判断这个天数能不能做出m束花
high=days;
else
low=days+1; //做不出来的花增加天数
}
return low;
}
bool help(vector<int> bloomDay,int days,int m,int k){
int bouquets=0; //能制作的花束
int flowers=0; //记录有几朵花了
for(int i=0;i<bloomDay.size();++i){
if(bloomDay[i]<=days){ //假如当前花开的天数<=days
flowers++; //这朵花可用
if(flowers==k){ //立即判断花够不够用来做成一束花
bouquets++; //可以的话花束+1,flowers=0
flowers=0;
}
}else{ //假如当前花开的天数>days,那么就失去连续性了,flowers=0
flowers=0;
}
}
return bouquets>=m; //假如能够做的花束>=需要做的花束,返回true
}
};