每天一道算法題(十一)

水壺問題

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

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章