用Python编写程序查找使m束花所需的最少天数
假设我们有一个名为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 := bloomDay的大小
-
如果m * k >n,则
- 返回-1
- 定义一个函数possible()。这将采用x
-
count=0,bouquets=0
-
对于bloomDay中的每个d,执行以下操作−
- 如果d≤x,则
- count=count+1
-
如果计数与k相同,则
-
bouquets=bouquets+1
-
count=0
-
否则,
- 计数=0
- 如果d≤x,则
- 如果bouquets≥m,则返回true,否则返回false
-
从主方法执行以下操作−
-
左:=0,右:=1 + bloomDay的最大值
-
while left
- mid:=(左+右)/ 2
-
如果possible(mid)为true,则
- right:=mid
- 否则,
- left:=mid + 1
- 如果possible(left)为true,则
- 返回left
- 否则返回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