LeetCode:1482. 制作 m 束花所需的最少天数
这道题 用 二分, 有点不好想
题目类似: LCP 12. 小张刷题计划 ( 二分扩展 )
与经典二分有点不同
问题是怎么去分
bloomDay 数组中,每个花开的时间是不一样的, 必须要到花开后才能作为材料做成一束花。
直接枚举天数作为 value, 然后查找数组中能够做成几束花 ( 即数组中在 value 及之前就开花的花有多少个 )
AC Code
class Solution {
public int minDays(int[] b, int m, int k) {
int len = b.length;
if(len < m * k) return -1;
// 找上限下限
int left = 1, right = Arrays.stream(b).max().getAsInt();
while(left <= right) {
int mid = left + (right - left) / 2;
if(check(b, m, k, mid)) {
// 摘不够,需要更多的花
left = mid + 1;
} else {
right = mid - 1;
}
}
return left;
}
public boolean check(int[] b, int m, int k, int target) {
int cnt = 0;
int len = b.length;
int tmp = 0;
for(int i = 0; i < len; i++) {
if(b[i] <= target) {
// 已经开花
tmp++;
if(tmp >= k) {
// 够做一束花的材料了
tmp = 0;
cnt++;
}
} else {
tmp = 0;
}
}
return cnt < m;
}
}