1. FlyPython首页
  2. 数据结构与算法
  3. leetcode题解

「LeetCode每日一题」——365. 水壶问题

365. 水壶问题

链接:https://leetcode-cn.com/problems/water-and-jug-problem/
难度:中等

题目

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

如果可以,最后请用以上水壶中的一或两个来盛放取得的 z升 水。

你允许:

装满任意一个水壶
清空任意一个水壶
从一个水壶向另外一个水壶倒水,直到装满或者倒空
示例 1: (From the famous "Die Hard" example)

输入: x = 3, y = 5, z = 4
输出: True
示例 2:

输入: x = 2, y = 6, z = 5
输出: False

思路

理解这道题的题意,有两个水壶,容量分别是X,Y,我们通过这两个水壶的操作可以做以下的事情:

  1. 给空壶加满水,总量为 X或者Y
  2. 倒掉一壶满水,总量减少 X或者Y
  3. 倒掉一壶不满的水,总量变成X或者Y或者0
  4. 往不满的壶里加水,总量变为X或者Y或者X+Y
  5. 从一个壶往另外一个壶倒水,总量不变

由上面五个情况可以看到,总量一定是ax+by(a,b为整数),
所以z=ax+by

这里引入一个定理: 贝祖定理

贝祖定理:若x,y是整数,且gcd(x,y)=d,那么对于任意的整数a,b,ax+by都一定是d的倍数,特别地,一定存在整数a,b,使ax+by=d成立

由贝祖定理知道,z一定是x,y最大公约数的整数倍,这题就转换成了求判断z是否为x,y最大公约数的整数倍。

具体见解决方案。

方案代码

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
        return z % math.gcd(x,y) == 0

原创文章,作者:flypython,如若转载,请注明出处:http://flypython.com/algorithm/leetcode/242.html