题目
给你一个整数数组
bloomDay
,以及两个整数m
和k
。
现需要制作m
束花。制作花束时,需要使用花园中 相邻的k
朵花 。
花园中有n
朵花,第i
朵花会在bloomDay[i]
时盛开,恰好可以用于一束花中。
请你返回从花园中摘 m 束花需要等待的最少的天数。如果不能摘到 m 束花则返回-1
。
解题
查找所需最小的天数,那么天数必然在最大天数和最小天数之间,可以采用二分法解题
class Solution {
public int minDays(int[] bloomDay, int m, int k) {
if(bloomDay.length < m * k) return -1;
int low = bloomDay[0], high = bloomDay[0];
for(int x : bloomDay){
if(low > x) low = x;
if(high < x) high = x;
}
while(low < high){
int mid = low + (high - low) / 2;
if(flower(bloomDay, m, k, mid)) high = mid;
else low = mid + 1;
}
return low;
}
public boolean flower(int[] bloomDay, int m, int k, int mid){
int flowers = 0; // 代表可用的花的个数
int makeFlowers = 0; // 代表当前天数mid可以制作出的花的数量
for(int i = 0; i < bloomDay.length; i++){
if(bloomDay[i] <= mid){
flowers++;
if(flowers == k){
makeFlowers++;
flowers = 0;
}
}else flowers = 0;
}
return makeFlowers >= m;
}
}