给定 N 个无限容量且初始均空的水缸,每个水缸配有一个水桶用来打水,第 i
个水缸配备的水桶容量记作 bucket[i]
。小扣有以下两种操作:
- 升级水桶:选择任意一个水桶,使其容量增加为
bucket[i]+1
- 蓄水:将全部水桶接满水,倒入各自对应的水缸
每个水缸对应最低蓄水量记作 vat[i]
,返回小扣至少需要多少次操作可以完成所有水缸蓄水要求。
注意:实际蓄水量 达到或超过 最低蓄水量,即完成蓄水要求。
示例 1:
输入:bucket = [1,3], vat = [6,8]
输出:4
解释: 第 1 次操作升级 bucket[0]; 第 2 ~ 4 次操作均选择蓄水,即可完成蓄水要求。
示例 2:
输入:bucket = [9,0,1], vat = [0,2,2]
输出:3
解释: 第 1 次操作均选择升级 bucket[1] 第 2~3 次操作选择蓄水,即可完成蓄水要求。
示例代码1:
class Solution(object):
def storeWater(self, bucket, vat):
"""
:type bucket: List[int]
:type vat: List[int]
:rtype: int
"""
# 如果所有水缸容量为0,操作次数为0
if max(vat) == 0:
return 0
def check(x):
# 总共需要升级的次数
count = 0
for i, j in zip(bucket, vat):
# 需要蓄水x次,求出对应水桶的最小容量
t = (j-1+x) // x
# 可能原始水桶容量大于t,所以升级次数取0和t-a的较大值
count += max(0, t-i)
# 返回升级次数+蓄水次数
return count+x
# 返回值,最少需要操作的次数
res = float('inf')
# 枚举蓄水的次数
low, high = 1, max(vat)
for i in range(low, high+1):
res = min(res, check(i))
# return res
return res if res!=float('inf') else 0
思路: 因为最后蓄水的操作是所有水桶一起执行,所以枚举蓄水次数(蓄水次数不超过水缸的最大值)。已知水缸总大小,就可以得出蓄水前水桶的大小,从而得出水桶升级次数,记录每个蓄水次数i对应的总操作次数,即升级次数+蓄水次数 最后保留所有枚举的蓄水次数中总操作次数最小的值即可 复杂度分析:
- 时间复杂度:O(N),N为bucket和vat元素的范围
- 空间复杂度:O(1)