惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

B
Blog
B
Blog RSS Feed
小众软件
小众软件
博客园_首页
OSCHINA 社区最新新闻
OSCHINA 社区最新新闻
大猫的无限游戏
大猫的无限游戏
freeCodeCamp Programming Tutorials: Python, JavaScript, Git & More
博客园 - 聂微东
WordPress大学
WordPress大学
月光博客
月光博客
S
SegmentFault 最新的问题
Engineering at Meta
Engineering at Meta
量子位
V
Visual Studio Blog
罗磊的独立博客
Last Week in AI
Last Week in AI
The Cloudflare Blog
H
Help Net Security
J
Java Code Geeks
钛媒体:引领未来商业与生活新知
钛媒体:引领未来商业与生活新知
Microsoft Azure Blog
Microsoft Azure Blog
The GitHub Blog
The GitHub Blog
奇客Solidot–传递最新科技情报
奇客Solidot–传递最新科技情报
美团技术团队

博客园 - Fanny123

LeetCode最大数字范围的整数之和 LeetCode统计好子数组 LeetCode边界与内部和相等的稳定子数组 三段式数组II 变为活跃状态的最小时间 平衡装运的最大数量 三段式数组 I 相邻字符串之间的最长公共前缀 分割字符串 找出数组中的所有 K 近邻下标 使叶子路径成本相等的最小增量 硬币面值还原 检查元素频次是否为质数 等积子集的划分方案 统计一个数组中好对子的数目 C# 基础(更新中) 圆形靶内的最大飞镖数量 丑数 验证栈序列 BST的中序后继
LeetCode 1482. 制作 m 束花所需的最少天数
Fanny123 · 2020-06-25 · via 博客园 - Fanny123

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

题目

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

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

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

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

K<=N<=105
M<=106

题目理解

找到数组中的m组,每组是k个相邻元素组成(组之间不能有重复),使得这些元素的最大值day最小。

题解

二分

用二分的方法,找到第一个x,使得<x的day都不能满足有m组。
所以现在要以mid为最大天数,求这样的情况下最多能有多少个分组。

时间复杂度:
外层二分:O(log2(VAL))=O(30)
内层:O(n)

    public int MinDays(int[] bloomDay, int m, int k) {
        //binary search
        int min=1000000000;
        int max=1;
        foreach(int val in bloomDay){
            min=Math.Min(min,val);
            max=Math.Max(max,val);
        }
        // Console.WriteLine(min+","+max);
        int left=min;
        int right=max;
        while(left<=right){
            int mid=(left+right)>>1;
            int groupCnt=getCnt(mid,bloomDay,k);
            if(m<=groupCnt){//[10,10],组个数是2>目标1,但是下一次缩小范围会退出循环,所以放到这里
                //检查左侧是否能更小
                if(getCnt(mid-1,bloomDay,k)<m){
                    return mid;
                }else{
                    right=mid-1;
                }
            }else{
                left=mid+1;
            }
        }
        return -1;
    }

    private int getCnt(int max,int[] bloomDay,int k){
        int continues=0;
        int groupCnt=0;
        foreach(int val in bloomDay){
            if(val<=max){
                continues++;
                if(continues==k){
                    continues=0;
                    groupCnt++;
                }

            }else{
                continues=0;
            }
        }
        return groupCnt;
    }