有两个容量分别为 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
https://leetcode-cn.com/problems/water-and-jug-problem/
在任意一个时刻,我们可以且仅可以采取以下几种操作:
1.把 X 壶的水灌进 Y 壶,直至灌满或倒空;
总量不变
2.把 Y 壶的水灌进 X 壶,直至灌满或倒空;
总量不变
3.把 X 壶灌满;
+x
4.把 Y 壶灌满;
+y
5.把 X 壶倒空;
-x
6.把 Y 壶倒空。
-y
可以得出结论,最终的水量始终是aX+bY,贝祖定理告诉我们, ax+by=z 有解当且仅当 z 是 x,y 的最大公约数的倍数
class Solution {
public:
bool canMeasureWater(int x, int y, int z) {
if ( x== 0 && y == 0) { return z == 0; }
if (z > x + y) { return false; }
return z % __gcd(x,y) == 0;
}
};
网友评论