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

#题目描述:

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

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

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

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

#解题思路:

首先求出花朵生成的最小天数low和最大天数high,然后使用二分法,判断天数为mid时是否满足条件。满足条件通过辅助函数canMake组成求满足k的最小连续子串的个数即可。

class Solution {
public:
    int minDays(vector<int>& bloomDay, int m, int k) {
        int bloomDaySize=bloomDay.size();
        if(m*k > bloomDaySize)
            return -1;

        int low=INT_MAX;
        int high=INT_MIN;

        for(int day:bloomDay){
            low=min(day,low);
            high=max(day,high);
        }

        while(low<high){
            int mid = low+(high-low)/2;
            if(canMake(bloomDay,m,mid,k))
                high=mid;
            else
                low=mid+1;
        }

        return low;
    }

    bool canMake(vector<int>& bloomDay, int m, int day, int k){
        int flowerNum = 0;
        int seriesFlowerNum = 0;
        int index=0;
        while(index<bloomDay.size()&&flowerNum<m){
            if(bloomDay[index]<=day){
                seriesFlowerNum +=1;
                if(seriesFlowerNum ==k){
                    flowerNum++;
                    seriesFlowerNum =0;
                    }
            }
            else{
                seriesFlowerNum =0;
            }
            index++;
        }
        return flowerNum==m;
    }
};

 

 

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值