假设我们有一个名为 nums 的整数数组,我们还有另外两个值 m 和 k。现在,我们需要制作 m 个花束。要制作一束花,我们需要花园中的 k 朵相邻的花。这里的花园由n种不同的花组成,第i朵花将在bloomDay[i]盛开。每朵花只能用在一个花束中。我们必须找到从花园里制作 m 束花需要等待的最少天数。如果我们不能制作 m 个花束,则返回 -1。
所以,如果输入是像bloomDay = [5,5,5,5,10,5,5] m = 2 k = 3,那么输出将是10,因为我们需要2 (m = 2)个花束,每个应该有3朵花。
第 5 天后:[x, x, x, x, _, x, x],我们可以用前三朵开花的花制作一束花,但不能制作另一束花
第 10 天后:[x, x, x, x, x, x, x],现在我们可以用不同的方法制作两束花束了。
为了解决这个问题,我们将按照以下步骤操作 -
n := 开花日的大小
如果 m * k > n,则
返回-1
定义一个函数possible()。这将需要 x
计数:= 0,花束:= 0
对于每个 d 花开日,做
计数:= 0
计数 := 计数 + 1
如果计数与 k 相同,则
花束 := 花束 + 1
计数:= 0
如果 d <= x,则
否则,
如果花束 >= m,则返回 true,否则返回 false
从主要方法执行以下操作 -
左:= 0,右:= 1 + 最大的bloomDay
当左 < 右时,做
左 := 中 + 1
右 := 中
中:=(左+右)/2
如果possible(mid)是真的,那么
否则,
如果possible(left)是真的,那么
返回左
否则返回左 + 1
让我们看看以下实现以获得更好的理解 -
def solve(bloomDay, m, k): n = len(bloomDay) if m * k > n: return -1 def possible(x): count = 0 bouquets = 0 for d in bloomDay: if d <= x: count += 1 if count == k: bouquets += 1 count = 0 else: count = 0 return bouquets >= m left, right = 0, max(bloomDay) + 1 while left < right: mid = (left + right)//2 if possible(mid): right = mid else: left = mid + 1 if possible(left): return left else: return left + 1 bloomDay = [5,5,5,5,10,5,5] m = 2 k = 3 print(solve(bloomDay, m, k))
[5,5,5,5,10,5,5], 2, 3输出结果
10