LeetCode每日一题(1482. 制作 m 束花所需的最少天数)
Posted XiaoFanMi
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了LeetCode每日一题(1482. 制作 m 束花所需的最少天数)相关的知识,希望对你有一定的参考价值。
给你一个整数数组 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
示例 2:
输入:bloomDay = [1,10,3,10,2], m = 3, k = 2
输出:-1
解释:要制作 3 束花,每束需要 2朵花,也就是一共需要 6 朵花。而花园中只有 5 朵花,无法满足制作要求,返回 -1 。
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/minimum-number-of-days-to-make-m-bouquets
思路和代码
先判断m*k是否小于数组长度,如果数量不满足直接返回-1
使用二分搜索的方法搜索在某一天时,小于该天数的数量有多少,再遍历查找相邻的k个花有几对
class Solution {
public int minDays(int[] bloomDay, int m, int k) {
if (bloomDay.length == 0 || m * k > bloomDay.length) {
return -1;
}
int left = 1;//默认设定1
int right = 0;//最大天数
for (int i = 0; i < bloomDay.length; i++) {//遍历查找最大天数
right = Math.max(right, bloomDay[i]);
}
while (left < right) {
int mid = left + (right - left) / 2;
int makeNum = 0;//能够制作的数量
int numBloom = 0;//相邻的花的数量
for (int x : bloomDay) {
numBloom=x<=mid?numBloom+1:0;
if (numBloom==k){//相邻花的数量满足k则制作花的数量+1
++makeNum;
numBloom=0;
}
}
if (makeNum>=m){
right=mid;
}else{
left=mid+1;
}
}
return left;
}
}
以上是关于LeetCode每日一题(1482. 制作 m 束花所需的最少天数)的主要内容,如果未能解决你的问题,请参考以下文章
《LeetCode之每日一题》:24. 制作 m 束花所需的最少天数
我用java刷 leetcode 1482. 制作 m 束花所需的最少天数