美文网首页
365.水壶问题

365.水壶问题

作者: 等不了天明等时光 | 来源:发表于2020-03-25 22:00 被阅读0次

解题思路

裴蜀定理(或贝祖定理),说明了对任何整数a、b和它们的最大公约数d,关于未知数x和y的线性不定方程(称为裴蜀等式):若a,b是整数,且gcd(a,b)=d,那么对于任意的整数x,y,ax+by都一定是d的倍数,特别地,一定存在整数x,y,使ax+by=d成立。它的一个重要推论是:a,b互质的充要条件是存在整数x,y,使ax+by=1。
对于本题,我们可以认为每次操作只会给水的总量带来 x 或者 y 的变化量。因此我们的目标可以改写成:找到一对整数a,b,使得ax+by=z。而只要满足 z≤x+y,且这样的a,b存在,那么目标就是可以达成的。而贝祖定理告诉我们,ax+by=z有解当且仅当z是x,y的最大公约数的倍数。因此我们只需要找到 x,y的最大公约数并判断 z 是否是它的倍数即可。
如果gcd(x, y)=k,表示x,y的最大公约数为k,则必定有整数m,n,使得 mx+ny=k,若z%k==0,则必有常数c,使得c(mx+ny)=ck=z。所以本题关键就是寻找x与y的最大公约数。注意需要判断几种特殊情况。
复杂度分析:
时间复杂度:O(log(min(x,y))),取决于计算最大公约数所使用的辗转相除法。
空间复杂度:O(1),只需要常数个变量。

代码

class Solution:
    def canMeasureWater(self, x: int, y: int, z: int) -> bool:
        # 判断特殊情况
        if x + y < z:
            return False
        if (x==0 or y==0):
            return z==0 or x+y==z
        def gcd(a,b):
            return a if b==0 else gcd(b, a%b)
        k = gcd(x, y)
        return True if z%k==0 else False

相关文章

  • 365. 水壶问题

    【Description】有两个容量分别为 x升 和* y*升 的水壶以及无限多的水。请判断能否通过使用这两个水壶...

  • 365.水壶问题

    解题思路 裴蜀定理(或贝祖定理),说明了对任何整数a、b和它们的最大公约数d,关于未知数x和y的线性不定方程(称为...

  • 365. 水壶问题

    题目 有两个容量分别为 x升 和 y升 的水壶以及无限多的水。请判断能否通过使用这两个水壶,从而可以得到恰好 z升...

  • leetcode 365. 水壶问题

    这道题我没有提交,原因是我还不能完全理解。

  • LeetCode 365. 水壶问题

    有两个容量分别为 x升 和 y升 的水壶以及无限多的水。请判断能否通过使用这两个水壶,从而可以得到恰好 z升 的水...

  • LeetCode 365.水壶问题

    题目 水壶问题链接可能点不进去,所以我把完整的题目写在了下面。 分析 题意非常清晰,没有异议。对于示例 1我们可以...

  • LeetCode-python 365. 水壶问题

    题目链接[https://leetcode.cn/problems/water-and-jug-problem] ...

  • 每日一题-leetcode 365. 水壶问题

    有两个水壶,容量分别为 jug1Capacity 和 jug2Capacity 升。水的供应是无限的。确定是否有可...

  • 水壶问题

    题目: 题目的理解: 起初设想的解决方式:(1)x和y的相差,求得所有相差的值,即每一个值与所有的值相减,直到不会...

  • 水壶问题通解

    有两个容量分别为a升和b升的水壶以及无限多的水。请判断能否通过使用这个两个水壶,从而可以得到恰好z升的水?你允许进...

网友评论

      本文标题:365.水壶问题

      本文链接:https://www.haomeiwen.com/subject/jhdfuhtx.html