有两个容量分别为 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
func getMaxMin(x int, y int) (int, int) {
if y > x {
x, y = y, x
}
return x, y
}
func canMeasureWater(x int, y int, z int) bool {
// 1. z > x + y => 不存在
if z > x + y {
return false
}
// 2. z == x + y => x + y = z
if z == x + y {
return true
}
// 3. z < x + y
max, min := getMaxMin(x, y)
if min == 0 || max == 0 {
if max == z || min == z{
return true
} else {
return false
}
}
cnt := min
tmp := 0
for i := 0; i < cnt; {
if min + tmp == z || tmp == z || min == z {
return true
} else {
tmp += min
if tmp > max {
tmp -= max
i++
}
}
}
return false
}