LeetCode 1482. 制作 m 束花所需的最少天数

主页有其他数据结构内容(持续更新中)

难度:Medium

代码:

class Solution {
private:
    //  如果当前天数可以完成m束花的制作,return true
    bool check(vector<int>& bloomDay, int m, int k, int days) {
        //  记录已经完成的花束的数量
        int count = 0; 
        //  两个条件有一个不满足就会跳出循环
        for(int i = 0; i < bloomDay.size() && count < m;) {
            //  curNum表示当前可以用于制作花束的花朵数量
            int curNum = bloomDay[i] <= days ? 1 : 0;
            int j = i + 1;
            if(curNum) {
                //  循环判断有多少相邻的、可用的花朵
                while(curNum < k && j < bloomDay.size() && bloomDay[j] <= days) {
                    j++;
                    curNum++;
                }
                //  如果相邻的、可用的花朵数量足够,则令count++,表示已经成功制作一束花
                if(curNum == k) {
                    count++;
                }
                //  j之前的花朵已经被用过或者已经被判断为数量不够不能用于制作,因此不用再考虑了
                i = j;
            }
            //  如果该花在days天时尚未开放,就直接跳过
            else {
                i++;
            }
        }
        return count >= m;
    }
public:
    int minDays(vector<int>& bloomDay, int m, int k) {
        if(m * k > bloomDay.size()) {
            return -1;
        }
        //  求出理论最小时间和理论最大时间
        int lower = bloomDay[min_element(bloomDay.begin(), bloomDay.end()) - bloomDay.begin()];
        int upper = bloomDay[max_element(bloomDay.begin(), bloomDay.end()) - bloomDay.begin()];
        int left = lower - 1;
        int right = upper + 1;
        while(left + 1 < right) {
            int mid = left + (right - left) / 2;
            if(check(bloomDay, m, k, mid)) {
                right = mid;
            }
            else {
                left = mid;
            }
        }
        return right;
    }
};
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值