题目描述
给你一个整数数组 bloomDay,以及两个整数 m 和 k 。
现需要制作 m 束花。制作花束时,需要使用花园中 相邻的 k 朵花 。
花园中有 n 朵花,第 i 朵花会在 bloomDay[i] 时盛开,恰好 可以用于 一束 花中。
请你返回从花园中摘 m 束花需要等待的最少的天数。如果不能摘到 m 束花则返回 -1 。
解析 - 二分
python代码
class Solution:
def minDays(self, bloomDay: List[int], m: int, k: int) -> int:
if m*k > len(bloomDay): return -1
if m*k == len(bloomDay): return max(bloomDay)
data = sorted(bloomDay)
left = m*k - 1
right = len(data) - 1
while left < right:
mid = left + (right-left)//2
key = data[mid]
cnt = 0
pre = 0
for i in range(len(bloomDay)):
if bloomDay[i] <= key:
pre += 1
else:
cnt += pre//k
pre = 0
cnt += pre//k # 最后加上pre非空能组成的数量
if cnt < m:
left = mid + 1
else:
right = mid
return data[left]