您当前的位置: 首页 > 

IT之一小佬

暂无认证

  • 1浏览

    0关注

    1192博文

    0收益

  • 0浏览

    0点赞

    0打赏

    0留言

私信
关注
热门博文

蓄水(最少次数)

IT之一小佬 发布时间:2021-07-05 18:49:43 ,浏览量:1

给定 N 个无限容量且初始均空的水缸,每个水缸配有一个水桶用来打水,第 i 个水缸配备的水桶容量记作 bucket[i]。小扣有以下两种操作:

  • 升级水桶:选择任意一个水桶,使其容量增加为 bucket[i]+1
  • 蓄水:将全部水桶接满水,倒入各自对应的水缸

每个水缸对应最低蓄水量记作 vat[i],返回小扣至少需要多少次操作可以完成所有水缸蓄水要求。

注意:实际蓄水量 达到或超过 最低蓄水量,即完成蓄水要求。

示例 1:

输入:bucket = [1,3], vat = [6,8]

输出:4

解释: 第 1 次操作升级 bucket[0]; 第 2 ~ 4 次操作均选择蓄水,即可完成蓄水要求。vat1.gif

示例 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)
关注
打赏
1665675218
查看更多评论
立即登录/注册

微信扫码登录

0.0912s