题目出处:https://leetcode-cn.com/problems/minimum-number-of-days-to-make-m-bouquets/
思路:
- 每束花需要k朵花,需要制作m束花一共需要km朵花。如果花园中的花朵数量少于km,则无法制作出指定数量的花束,返回-1。如果数组bloomDay的长度大于或等于km,则一定可以制作出指定数量的花束。
- 定义一个辅助函数canMake,表示第days天能否完成指定任务,若能则返回true,不能则返回false。
- 随着days的增大,cmake会从false变成true,所以这个辅助函数是关于days递增的,因此可通过二分查找法得出答案,其中二分查找的初始值low=min(bloom),high=max(bloom)。
class Solution {
public:
int minDays(vector<int>& bloomDay, int m, int k) {
if (m > bloomDay.size() / k) {
return -1;
}
int low = INT_MAX, high = 0;
int length = bloomDay.size();
for (int i = 0; i < length; i++) {
low = min(low, bloomDay[i]);
high = max(high, bloomDay[i]);
}
while (low < high) {
int days = (high - low) / 2 + low;
if (canMake(bloomDay, days, m, k)) {
high = days;
} else {
low = days + 1;
}
}
return low;
}
bool canMake(vector<int>& bloomDay, int days, int m, int k) {
int bouquets = 0;
int flowers = 0;
int length = bloomDay.size();
for (int i = 0; i < length && bouquets < m; i++) {
if (bloomDay[i] <= days) {
flowers++;
if (flowers == k) {
bouquets++;
flowers = 0;
}
} else {
flowers = 0;
}
}
return bouquets >= m;
}
};