剑指offer

365. 水壶问题

2020-03-31  本文已影响0人  人一己千

题目

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

来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/water-and-jug-problem
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

思路

重点是参悟到 每次增加或者减少的水量要么是x要么是y。

以下解释来自官方题解

你可能认为这有问题:如果往一个不满的桶里放水,或者把它排空呢?那变化量不就不是 x 或者 y 了吗?接下来我们来解释这一点:

因此,我们可以认为每次操作只会给水的总量带来 x 或者 y 的变化量。因此我们的目标可以改写成:找到一对整数 a, ba,b,使得
ax+by=z
剩下的就是找x和y的最大公因数,如果z是他们最大公因数的倍数的话那就是有解了。

代码


class Solution:
    def canMeasureWater(self, x: int, y: int, z: int) -> bool:
        if z == 0: return True
        if x + y < z: return False
        if x == 0 and y == 0: return z == 0
        if x == 0 or y == 0 : return z == x+y
        while x%y != 0:
            t = x%y
            x = y
            y = t
        return z%y==0

总结

边界值判断。
辗转相除找最大公因数。

上一篇下一篇

猜你喜欢

热点阅读