【leetcode每日一刷】2020-03-20,365. 水壶问题

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

你可能感兴趣的:(【leetcode每日一刷】2020-03-20,365. 水壶问题)