使用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
如果 count 等于 k,则
bouquets := bouquets + 1
count := 0
否则,
count := 0
如果 bouquets >= m,则返回 true,否则返回 false
从主方法执行以下操作:
left := 0, right := 1 + bloomDay 的最大值
当 left < right 时,执行:
mid := (left + right) / 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
数据结构
网络
关系数据库管理系统 (RDBMS)
操作系统
Java
iOS
HTML
CSS
Android
Python
C语言编程
C++
C#
MongoDB
MySQL
Javascript
PHP