LeetCode 水壶问题

水壶问题


题目来源:https://leetcode-cn.com/problems/water-and-jug-problem/python

题目


有两个容量分别为 x 升和 y 升的水壶以及无限多的水。请判断可否经过使用这两个水壶,从而能够获得刚好 z 升的水?bash

若是能够,最后请用以上水壶中的一或两个来盛放取得的 z 升水。微信

你容许:ide

  • 装满任意一个水壶
  • 清空任意一个水壶
  • 从一个水壶向另一个水壶倒水,直到装满或者倒空

示例 1: (From the famous "Die Hard" example)spa

输入: x = 3, y = 5, z = 4
输出: True

示例 2:code

输入: x = 2, y = 6, z = 5
输出: False

解题思路


思路:裴蜀定理blog

裴蜀定理是关于最大公约数的定理。ip

对于任何整数 a、b 和 m,d 为 a 及 b 的最大公约数,关于未知数 x 和 y 的线性不定方程:leetcode

$$ax + by = m$$get

有整数解时,当且仅当 m 是 a 及 b 的最大公约数 d 的倍数。

审题可得:其实每次操做能够认为是让壶里的水总量增长 x,增长 y,减小 x,减小 y。

这里涉及到一个壶的水不空的状况下,那么对于上面的结论来讲明显是不成立。不着急,这里解释下:

对于示例 1,题目给出 x = 3, y = 5, z = 4。

尝试如何让壶盛放 4 升的水。(这里将可盛放 x 升水的壶设为 A,可盛放 y 升水的壶设为 B,形如 (0, 0),表示两个壶盛放的水)

  1. 首先将 B 装满,此时两个壶盛放水的状况:(0, 5);
  2. 将 B 壶的水倒入 A 中,两个壶的状况:(3, 2);
  3. 将 A 壶中的水倒掉,两个壶的状况:(0, 2);
  4. 再次将 B 壶中的水倒入 A 中,此时:(2, 0);
  5. 将 B 壶装满,此时两个壶的状况:(2, 5);
  6. 将 B 壶的水倒入 A 中直至倒满,此时:(3, 4)。

这个时候 ,B 壶中的水为 4 升,便是所求得结果。

  • 在这里,咱们能够观察到,在操做的过程当中,是不会让两个壶同时有水且不满的状况发生。
  • 并且,给未满的壶盛放水并无意义。假设给一个未满的壶盛放水时,若是另一个壶是满的,那这种状况就至关于初始状态下直接给两个壶装满;若是另外一个壶是空的,那这个就至关因而直接在初始状态下,给当前壶盛满水。
  • 一样的,将未满的壶中的水倒掉也是没有意义的。假设倒掉一个未满的壶中的水,若是另一个壶是满的,这种状况就至关于初始状态下直接给另一个壶装满水;若是另一个壶是空的,那么这将又回到初始的状态。

因此这里就能够明确前面所得的结论:每次操做,水的总量只会带来 x 或 y 的变化量。

如今咱们将问题转化为求一对整数 a,b,使得

$$ax + by = z$$

只要知足 $z \leq x+y$,表示目标可得。

注意,这里跟上面的裴蜀定理的式子有所不一样,这里 a,b 表示所需求得的目标,而 x,y 已知。(与裴蜀定理式子恰好反过来)。

由题可知:

当 $a \geq 0, b \geq 0$ 时,可求得目标;

当 $a<0$ 时,则须要进行如下操做:(延用上面的 A 壶,B 壶)

  • 先往 B 壶装满水;
  • 将 B 壶的水往 A 壶倒;
  • 这个时候,若是 B 壶还有水,表示 A 壶满了。将 A 壶的水倒掉,将 B 壶剩余的水倒入 A 壶中。

重复上面的操做,直到对 A 壶进行 a 次清空,而对 B 壶进行 b 次倒水操做。

当 $b<0$ 时,跟上面的状况相似,将对 A 壶和 B 壶的操做调换过来便可。

根据裴蜀定理, $ax+by=z$ 有解,当且仅当 z 是 x,y 的最大公约数的倍数。因此咱们只要找到 x,y 的最大公约数,而后判断 z 是不是这个最大公约数的倍数便可求得答案。

代码实现


class Solution:
    def canMeasureWater(self, x: int, y: int, z: int) -> bool:  
        import math
        if x + y < z:
            return False
        if x == 0 or y == 0:
            return z == 0 or x + y == z
        return z % math.gcd(x, y) == 0

实现结果


实现结果


以上就是根据裴蜀定理,求最大公约数,判断是否有解来解决《水壶问题》的主要内容。

欢迎关注微信公众号《书所集录》
相关文章
相关标签/搜索