主页有其他数据结构内容(持续更新中)
难度:Medium
代码:
class Solution {
private:
// 如果当前天数可以完成m束花的制作,return true
bool check(vector<int>& bloomDay, int m, int k, int days) {
// 记录已经完成的花束的数量
int count = 0;
// 两个条件有一个不满足就会跳出循环
for(int i = 0; i < bloomDay.size() && count < m;) {
// curNum表示当前可以用于制作花束的花朵数量
int curNum = bloomDay[i] <= days ? 1 : 0;
int j = i + 1;
if(curNum) {
// 循环判断有多少相邻的、可用的花朵
while(curNum < k && j < bloomDay.size() && bloomDay[j] <= days) {
j++;
curNum++;
}
// 如果相邻的、可用的花朵数量足够,则令count++,表示已经成功制作一束花
if(curNum == k) {
count++;
}
// j之前的花朵已经被用过或者已经被判断为数量不够不能用于制作,因此不用再考虑了
i = j;
}
// 如果该花在days天时尚未开放,就直接跳过
else {
i++;
}
}
return count >= m;
}
public:
int minDays(vector<int>& bloomDay, int m, int k) {
if(m * k > bloomDay.size()) {
return -1;
}
// 求出理论最小时间和理论最大时间
int lower = bloomDay[min_element(bloomDay.begin(), bloomDay.end()) - bloomDay.begin()];
int upper = bloomDay[max_element(bloomDay.begin(), bloomDay.end()) - bloomDay.begin()];
int left = lower - 1;
int right = upper + 1;
while(left + 1 < right) {
int mid = left + (right - left) / 2;
if(check(bloomDay, m, k, mid)) {
right = mid;
}
else {
left = mid;
}
}
return right;
}
};