#题目描述:
给你一个整数数组 bloomDay,以及两个整数 m 和 k 。
现需要制作 m 束花。制作花束时,需要使用花园中 相邻的 k 朵花 。
花园中有 n 朵花,第 i 朵花会在 bloomDay[i] 时盛开,恰好 可以用于 一束 花中。
请你返回从花园中摘 m 束花需要等待的最少的天数。如果不能摘到 m 束花则返回 -1 。
#解题思路:
首先求出花朵生成的最小天数low和最大天数high,然后使用二分法,判断天数为mid时是否满足条件。满足条件通过辅助函数canMake组成求满足k的最小连续子串的个数即可。
class Solution {
public:
int minDays(vector<int>& bloomDay, int m, int k) {
int bloomDaySize=bloomDay.size();
if(m*k > bloomDaySize)
return -1;
int low=INT_MAX;
int high=INT_MIN;
for(int day:bloomDay){
low=min(day,low);
high=max(day,high);
}
while(low<high){
int mid = low+(high-low)/2;
if(canMake(bloomDay,m,mid,k))
high=mid;
else
low=mid+1;
}
return low;
}
bool canMake(vector<int>& bloomDay, int m, int day, int k){
int flowerNum = 0;
int seriesFlowerNum = 0;
int index=0;
while(index<bloomDay.size()&&flowerNum<m){
if(bloomDay[index]<=day){
seriesFlowerNum +=1;
if(seriesFlowerNum ==k){
flowerNum++;
seriesFlowerNum =0;
}
}
else{
seriesFlowerNum =0;
}
index++;
}
return flowerNum==m;
}
};