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

https://leetcode-cn.com/problems/minimum-number-of-days-to-make-m-bouquets/

给你一个整数数组 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

好久没做过二分了记录一下这道二分

l为数组最小值

r为数组最大值

二分求中间的天数判断是否符合条件,res_day  <  m , l = mid+1    res_day  >=   m ,r= mid

[1,10,3,9,12,10,4,5,7,3,2]

第一次1-12  mid = 6不符合条件6+1设置为l

7-12 mid = 9符合条件9设置为r

7-9 mid = 8不符合9设置为l()

返回l

(这里不会出现l大于r的情况出现mid是向下取整)

class Solution {
public:
    int minDays(vector<int>& bloomDay, int m, int k) {
        if(m*k > bloomDay.size())return -1;
        int l =  *min_element(bloomDay.begin(),bloomDay.end());
        int r =  *max_element(bloomDay.begin(),bloomDay.end());
        while(l < r)
        {
            int continue_day = 0;
            int res_day = 0;
            int mid = (l + r) >> 1;
            for(auto c : bloomDay)
            {
                if(c <= mid)
                {
                    continue_day++;
                    if(continue_day == k)
                    {
                        res_day++;
                        continue_day = 0;
                    }

                }else{
                    continue_day = 0;
                }
                
            }
            if(res_day < m)
            {
                l = mid+1;
            }else{
                r = mid;
            }
        }
        return l;
    }
};

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值