leetcode 365. 水壶问题

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

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

你允许:

  • 装满任意一个水壶
  • 清空任意一个水壶
  • 从一个水壶向另外一个水壶倒水,直到装满或者倒空

示例1:

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

示例2:

输入: x = 2, y = 6, z = 5
输出: False
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
class Solution(object):
def canMeasureWater(self, x, y, z):
"""
:type x: int
:type y: int
:type z: int
:rtype: bool
"""
#贝祖定理 ax+by = gcd(x,y)
def gcd(x,y):
if x < y:return gcd(y,x)
if y == 0:return x
elif x%2 == 0:
if y%2 == 0:return gcd(x>>1,y>>1)<<1
else:return gcd(x>>1,y)
else:
if y%2 == 0:return gcd(x,y>>1)
else:return gcd(y,x-y)

if z > x+y:return False
if z == y or z == x or z == x+y:return True
return z%gcd(x,y) == 0