给你一个整数数组 bloomDay,以及两个整数 m 和 k 。

现需要制作 m 束花。制作花束时,需要使用花园中 相邻的 k 朵花 。

花园中有 n 朵花,第 i 朵花会在 bloomDay[i] 时盛开,恰好 可以用于 一束 花中。

请你返回从花园中摘 m 束花需要等待的最少的天数。如果不能摘到 m 束花则返回 -1 。

示例 1:

输入:bloomDay = [1,10,3,10,2], m = 3, k = 1
输出:3

解释:让我们一起观察这三天的花开过程,x 表示花开,而 _ 表示花还未开。
现在需要制作 3 束花,每束只需要 1 朵。
1 天后:[x, _, _, _, _] // 只能制作 1 束花
2 天后:[x, _, _, _, x] // 只能制作 2 束花
3 天后:[x, _, x, _, x] // 可以制作 3 束花,
答案为 3

示例 2:

输入:bloomDay = [1,10,3,10,2], m = 3, k = 2
输出:-1

解释:要制作 3 束花,每束需要 2朵花,也就是一共需要 6 朵花。而花园中只有 5 朵花,无法满足制作要求,返回 -1 。

来源:力扣(LeetCode)
链接https://leetcode-cn.com/problems/minimum-number-of-days-to-make-m-bouquets

思路和代码

先判断m*k是否小于数组长度,如果数量不满足直接返回-1
使用二分搜索的方法搜索在某一天时,小于该天数的数量有多少,再遍历查找相邻的k个花有几对

class Solution {
    public int minDays(int[] bloomDay, int m, int k) {
        if (bloomDay.length == 0 || m * k > bloomDay.length) {
            return -1;
        }
        int left = 1;//默认设定1
        int right = 0;//最大天数
        for (int i = 0; i < bloomDay.length; i++) {//遍历查找最大天数
            right = Math.max(right, bloomDay[i]);
        }
        while (left < right) {
            int mid = left + (right - left) / 2;
            int makeNum = 0;//能够制作的数量
            int numBloom = 0;//相邻的花的数量
            for (int x : bloomDay) {
                numBloom=x<=mid?numBloom+1:0;
                if (numBloom==k){//相邻花的数量满足k则制作花的数量+1
                    ++makeNum;
                    numBloom=0;
                }
            }
            if (makeNum>=m){
                right=mid;
            }else{
                left=mid+1;
            }
        }
        return left;
    }
}

在这里插入图片描述