使用 Python 查找制作 m 束花的最少天数的程序
假设我们有一个名为nums的整数数组,我们还有另外两个值m和k。现在,我们需要制作m个花束。要制作一束花,我们需要花园中的k朵相邻的花。这里的花园由n种不同的花组成,第i朵花将在bloomDay[i]盛开。每朵花只能用在一个花束中。我们必须找到从花园里制作m束花需要等待的最少天数。如果我们不能制作m个花束,则返回-1。
所以,如果输入是像bloomDay=[5,5,5,5,10,5,5]m=2k=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