每天一道算法题(十一)

水壶问题

有两个容量分别为 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

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