[20210509]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 。
示例 3:
输入:
bloomDay = [7,7,7,7,12,7,7]
,m = 2
,k = 3
输出:12
解释:要制作2
束花,每束需要3
朵。 花园在7
天后和12
天后的情况如下:
7
天后:[x, x, x, x, _, x, x]
可以用前3
朵盛开的花制作第一束花。但不能使用后3
朵盛开的花,因为它们不相邻。
12
天后:[x, x, x, x, x, x, x]
显然,我们可以用不同的方式制作两束花。
示例 4:
输入:
bloomDay = [1000000000,1000000000]
,m = 1
,k = 1
输出:1000000000
解释:需要等1000000000
天才能采到花来制作花束
示例 5:
输入:
bloomDay = [1,10,2,9,3,8,4,7,5,6]
,m = 4
,k = 2
输出:9
提示:
bloomDay.length == n
1 <= n <= 10 ^ 5
1 <= bloomDay[i] <= 10^9
1 <= m <= 10^6
1 <= k <= n
题目地址:地址
正式分析
这道题可以从提示
对 bloomDay[i]
的定义中看出,花开天数可能会非常长,所以不可能用枚举法去做
因为这个花开天数过长,所以可以使用二分查找法
另外,这道题重点在于 【制作花束时,需要使用花园中 相邻的
k
朵花】这句话,必须是相邻的,如果不相邻,则不能用于做花
具体代码
function minDays(bloomDay: number[], m: number, k: number): number {
if (m * k > bloomDay.length) return -1
let Max = Math.max(...bloomDay)
let Min = Math.min(...bloomDay)
while(Min < Max) {
const centerDay = Math.floor((Max - Min) / 2 + Min)
if (canMake(bloomDay, m, k, centerDay)) {
Max = centerDay
} else {
Min = centerDay + 1
}
}
return Min
};
function canMake(bloomDay: number[], m: number, k: number, day: number): boolean {
let target = 0
let flowers = 0
const length = bloomDay.length
for (let i = 0; i < length && target < m; i++) {
if (bloomDay[i] <= day) {
flowers++
if (flowers === k) {
target++
flowers = 0
}
} else flowers = 0
}
return target >= m
}
TS AC,执行用时:144 ms
, 在所有 TypeScript
提交中击败了 100%
的用户
截至目前,TS 里应该是只有我提交了
最后
二分查找法
是一个非常常用的对规律数组查找而使用的方法,一般在 mysql
的底层中频繁使用
我们一般都过于依赖语言内置的通用查找方法而生疏了这个方法
这道题很好地展现了二分查找法
的应用方式
如果对其还是有些生疏,推荐继续练习二分查找的题型
如果我在哪里写的有问题,欢迎指出,共同进步,谢谢阅读~
标签:Min,朵花,number,束花,1482,bloomDay,制作,LeetCode 来源: https://blog.csdn.net/mxd26888/article/details/116570609