LeetCode 1482[二分法 优化] 制作m束花所需的最少天数 HERODING的LeetCode之路

Posted HERODING23

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了LeetCode 1482[二分法 优化] 制作m束花所需的最少天数 HERODING的LeetCode之路相关的知识,希望对你有一定的参考价值。

在这里插入图片描述在这里插入图片描述解题思路:
常见的二分法题目,这里二分的是开花的天数,优化在于最小天数和最大天数的定义,如果定义分别为花成熟最早和最晚时间,可以在一定程度上减少用时(官方题解从1开始不是最优情况),注意这里还要编写一个判断当前的限制时间开花的花数能否满足需求的函数,这样代码逻辑更清晰,注释已经很详尽了,代码如下:

class Solution {
public:
    int minDays(vector<int>& bloomDay, int m, int k) {
        int len = bloomDay.size();
        // 如果所需花总数大于花园花数,返回-1
        if(m * k > len) {
            return -1;
        }
        // 定义最大最小天数,分别为花成熟最早和最晚时间
        int low = *min_element(bloomDay.begin(), bloomDay.end()), high = *max_element(bloomDay.begin(), bloomDay.end());
        // 二分法遍历
        while(low < high) {
            int mid = (low + high) / 2;
            if(judge(bloomDay, m, k, mid)) {// 如果给的天数可以提供所需花束
                high = mid;
            } else {// 不能提供
                low = mid + 1;
            }
        }
        return low;
    }
    // 判断是否能够提供
    bool judge(vector<int>& bloomDay, int m, int k, int days) {
        // 定义总数,当前连续花数
        int count = 0, cur = 0;
        for(int i = 0; i < bloomDay.size() && count < m; i ++) {
            // 在规定期限开花
            if(bloomDay[i] <= days) {
                cur ++;
                if(cur == k) {// 达到连续指标
                    count ++;
                    cur = 0;
                }
            } else {
                cur = 0;
            }
        }
        return count >= m;
    }
};


/*作者:heroding
链接:https://leetcode-cn.com/problems/minimum-number-of-days-to-make-m-bouquets/solution/cer-fen-fa-you-hua-by-heroding-zy6q/
来源:力扣(LeetCode)
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。*/

以上是关于LeetCode 1482[二分法 优化] 制作m束花所需的最少天数 HERODING的LeetCode之路的主要内容,如果未能解决你的问题,请参考以下文章

1482. 制作 m 束花所需的最少天数(二分查找)

1482. 制作 m 束花所需的最少天数 (Java/c++二分查找)

1482. 制作 m 束花所需的最少天数 (Java/c++二分查找)

我用java刷 leetcode 1482. 制作 m 束花所需的最少天数

LeetCode每日一题(1482. 制作 m 束花所需的最少天数)

LeetCode1482. 制作 m 束花所需的最少天数 / 剑指 Offer 32 . 从上到下打印二叉树I/II/III