水壶问题
有两个容量分别为 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,一定存在整数a,b,使得ax+by一定是(x和y的最大公约数)的倍数。在这道题中,两个水壶就可看做是x和y,恰好装满的水就可以看作是x和y的最大公约数。
var canMeasureWater = function(x, y, z) {
if(x+y<z)return false
if(x==0|y==0) return z==0||x+y==z
return z % hcd(x,y) === 0
};
function hcd(x,y){
return y ===0 ? x : hcd(y,x % y) // 取最大公约数
}
执行用时 :72 ms
内存消耗 :33.9 MB