0二分法中等 LeetCode1482. 制作 m 束花所需的最少天数

该博客介绍了一个使用二分查找算法解决的问题:如何确定最少的天数来确保在花园里至少采摘到m束花,每束由k朵同一天盛开的花组成。当bloomDay数组长度大于m*k时,存在解;通过二分查找找到临界天数,判断在该天数及其之后是否能采摘到足够的花束。
摘要由CSDN通过智能技术生成

分析

只要bloomDay的长度超过m*k,那么一定会摘到花。
二分查找,答案具有二阶性,当天数是1~ans-1之间时,摘不到花,在ans~max一定会摘到花。

class Solution {
    public int minDays(int[] bloomDay, int m, int k) {

    int left = Integer.MAX_VALUE, right = Integer.MIN_VALUE;
        if (m * k > bloomDay.length) {
            return -1;
        }
        for (int num : bloomDay) {
            left = Math.min(left,num);
            right = Math.max(right,num);
        }
        while (left < right) {
            int mid = (right - left) / 2 + left;
            boolean res = judge(bloomDay,m,k,mid);
            if (!res) {
                left = mid + 1;
            } else {
                right = mid;
            }
        }
        return left;
    }

    public boolean judge(int[] bloomDay, int m, int k, int day) {
        int ans = 0;
        int i = 0;
        while (i < bloomDay.length) {
            while (i < bloomDay.length && bloomDay[i] > day) {
                i++;
            }
            if (i == bloomDay.length) {
                break;
            }
            int tmp = i;
            while (i < bloomDay.length && bloomDay[i] <= day) {
                i++;
            }
            ans += (i - tmp) / k;
        }
        return ans >= m;
    }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值