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
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 【Description】有两个容量分别为 x升 和* y*升 的水壶以及无限多的水。请判断能否通过使用这两个水壶...
    Chiduru阅读 1,729评论 0 0
  • 在C语言中,五种基本数据类型存储空间长度的排列顺序是: A)char B)char=int<=float C)ch...
    夏天再来阅读 8,782评论 0 2
  • 有两个容量分别为 x升 和* y*升 的水壶以及无限多的水。请判断能否通过使用这两个水壶,从而可以得到恰好 z升 ...
    _SHIZI阅读 2,578评论 0 0
  • 题目描述 有两个容量分别为 x升 和y升 的水壶以及无限多的水。请判断能否通过使用这两个水壶,从而可以得到恰好 z...
    1只特立独行的猪阅读 2,976评论 0 0
  • 题目 水壶问题链接可能点不进去,所以我把完整的题目写在了下面。 分析 题意非常清晰,没有异议。对于示例 1我们可以...
    Thebloodelves阅读 9,415评论 3 6