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

原题

1482.制作m束花所需的最少天数
2020年6月14日 第193周周赛第3题
在这里插入图片描述

题解

判断某一天的时候是否能够完成花束的采摘很容易,主要就是能否快速找到符合要求的最小的那一天。

方法一

我们可以把开花的天数都存起来,行程一个数组(无重复),并排序。从头开始判断每一天是否可以完成花束收集,返回第一个符合要求的天数。
遗憾的是,本思路超时。
代码示例:

class Solution {
    public int minDays(int[] bloomDay, int m, int k) {
        List<Integer> set=new ArrayList<>();
        for(int b:bloomDay){
            if(!set.contains(b))
                set.add(b);
        }
        int d[]=set.stream().mapToInt(Integer::valueOf).toArray();;
        Arrays.sort(d);
        for(int b:d){
            if(flowerEnough(b,bloomDay,m,k)){return b;}
        }
        return -1;
    }
    public boolean flowerEnough(int tian,int[] bloomDay,int m,int k){
        //此方法判断第tian天时能否完成花束组合
        int m1=m;
        int k1=0;
        for(int i=0;i<bloomDay.length;i++){
            if(bloomDay[i]<=tian){
                k1++;
                if(k1==k){
                    m1--;
                    if(m1==0){return true;}
                    k1=0;
                }
            }
            else{
                k1=0;
            }
        }
        return false;
    }
}
//2020.06.23 19:34
//84 / 91 个通过测试用例   状态:超出时间限制
//

方法二

二分法。反正天数在1e9范围内,因此最多需要找30次。
本思路java代码示例:

/*
 *@v7fgg
 *执行用时:22 ms, 在所有 Java 提交中击败了62.23%的用户
 *内存消耗:48.4 MB, 在所有 Java 提交中击败了100.00%的用户
 *2020年6月23日 19:13
 */
class Solution {
    public int minDays(int[] bloomDay, int m, int k) {
        int l=bloomDay.length;
        if(l>=m*k){
            int zuo=1;
            int you=1000000000;
            while(zuo<you){
                int mid=(zuo+you)/2;
                if(flowerEnough(mid,bloomDay,m,k)){you=mid;}
                else{zuo=mid+1;}
            }
            return flowerEnough(zuo,bloomDay,m,k)?zuo:-1;
        }
        return -1;      
    }
    public boolean flowerEnough(int tian,int[] bloomDay,int m,int k){
        //此方法判断第tian天时能否完成花束组合
        int m1=m;
        int k1=0;
        for(int i=0;i<bloomDay.length;i++){
            if(bloomDay[i]<=tian){
                k1++;
                if(k1==k){
                    m1--;
                    if(m1==0){return true;}
                    k1=0;
                }
            }
            else{
                k1=0;
            }
        }
        return false;
    }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

可爱抱抱呀

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值