365.水壶问题

解题思路

裴蜀定理(或贝祖定理),说明了对任何整数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.水壶问题)