给你一个整数数组 bloomDay,以及两个整数 m 和 k 。
现需要制作 m 束花。制作花束时,需要使用花园中 相邻的 k 朵花 。
花园中有 n 朵花,第 i 朵花会在 bloomDay[i] 时盛开,恰好 可以用于 一束 花中。
请你返回从花园中摘 m 束花需要等待的最少的天数。如果不能摘到 m 束花则返回 -1
**二分法
对制作天数这个可能区间进行二分
构造辅助函数判断当前天数能否制作m束花
**
class Solution {
public int minDays(int[] bloomDay, int m, int k) {
int n = bloomDay.length;
if(m * k > n)
return -1;
int low = 1, high = 1;
for(int i = 0; i < n; i++){
high = Math.max(high, bloomDay[i]);
}
while(low + 1 < high){
int mid = low + (high - low) / 2;
if(canMake(bloomDay, m, k, mid))
high = mid;
else
low = mid;
}
if(canMake(bloomDay, m, k, low))
return low;
if(canMake(bloomDay, m, k, high))
return high;
return -1;
}
private boolean canMake(int[] bloomDay, int m , int k, int days){
int flowers = 0;
int bouquets = 0;
for(int i = 0; i < bloomDay.length && bouquets < m; i++){
if(bloomDay[i] <= days){
flowers++;
if(flowers == k){
bouquets++;
flowers = 0;
}
}
else{
flowers = 0;
}
}
return bouquets >= m;
}
}