Leetcode 365.水壶问题
1 题目描述(Leetcode题目链接)
有两个容量分别为 x升 和 y升 的水壶以及无限多的水。请判断能否通过使用这两个水壶,从而可以得到恰好 z升 的水?
如果可以,最后请用以上水壶中的一或两个来盛放取得的 z升 水。
你允许:
- 装满任意一个水壶
- 清空任意一个水壶
- 从一个水壶向另外一个水壶倒水,直到装满或者倒空
输入: x = 3, y = 5, z = 4
输出: True
输入: x = 2, y = 6, z = 5
输出: False
2 题解
根据题目描述可知,每次操作造成的变化量只有 x x x或 y y y,因此本题换言之即是判断 a x + b y = z ax+by=z ax+by=z是否有整数解 a , b a,b a,b,前提是 x + y ≥ z x+y\ge z x+y≥z。因此根据裴蜀定理,方程有解当且仅当 g c d ( x , y ) ∣ z gcd(x,y)|z gcd(x,y)∣z, g c d ( x , y ) gcd(x,y) gcd(x,y)可由欧几里得算法求得。
class Solution:
def gcd(self, a, b):
if b == 0:
return a
return self.gcd(b, a%b)
def canMeasureWater(self, x: int, y: int, z: int) -> bool:
if z > x + y:
return False
if x == 0 or y == 0:
return z == 0 or x + y == z
g = self.gcd(x, y)
return z%g == 0