水壺問題
有兩個容量分別爲 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