文章目录

  • 水壶问题
    • 题目
    • 解题思路
    • 代码实现
    • 实现结果

水壶问题


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

题目


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

解题思路


思路:裴蜀定理

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

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

ax+by=max + by = max+by=m

有整数解时,当且仅当 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=zax + by = zax+by=z

只要满足 z≤x+yz \leq x+yz≤x+y,表示目标可得。

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

由题可知:

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

当 a<0a<0a<0 时,则需要进行以下操作:(延用上面的 A 壶,B 壶)

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

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

当 b<0b<0b<0 时,跟上面的情况类似,将对 A 壶和 B 壶的操作调换过来即可。

根据裴蜀定理, ax+by=zax+by=zax+by=z 有解,当且仅当 z 是 x,y 的最大公约数的倍数。所以我们只要找到 x,y 的最大公约数,然后判断 z 是否是这个最大公约数的倍数即可求得答案。

代码实现


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

实现结果



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


欢迎关注微信公众号《书所集录》

LeetCode 水壶问题相关推荐

  1. LeetCode 365. 水壶问题(最大公约数)

    文章目录 1. 题目 2. 最大公约数 1. 题目 有两个容量分别为 x升 和 y升 的水壶以及无限多的水.请判断能否通过使用这两个水壶,从而可以得到恰好 z升 的水? 如果可以,最后请用以上水壶中的 ...

  2. LeetCode —— 365. 水壶问题(Python3)

    有两个容量分别为 x升 和 y升 的水壶以及无限多的水.请判断能否通过使用这两个水壶,从而可以得到恰好 z升 的水? 如果可以,最后请用以上水壶中的一或两个来盛放取得的 z升水. 你允许: 装满任意一 ...

  3. Leetcode.365 水壶问题

    题目链接 Leetcode.365 水壶问题 mid 题目描述 有两个水壶,容量分别为 x和 y升.水的供应是无限的.确定是否有可能使用这两个壶准确得到 z升. 如果可以得到 z升水,最后请用以上水壶 ...

  4. LeetCode | 0365. Water and Jug Problem水壶问题【Python】

    LeetCode 0365. Water and Jug Problem水壶问题[Medium][Python][BFS][数学] Problem LeetCode You are given two ...

  5. [LeetCode解题报告] 365. 水壶问题

    [LeetCode解题报告] 365. 水壶问题 一. 题目 1. 题目描述 2. 原题链接 二. 解题报告 1. 思路分析 2. 复杂度分析 3. 代码实现 三. 本题小结 一. 题目 1. 题目描 ...

  6. leetcode 365. Water and Jug Problem | 365. 水壶问题(Java)

    题目 https://leetcode.com/problems/water-and-jug-problem/ 又是踩比赞多的一道题-我认为有两个可能的原因: 虽然通过了,但原理不明了. 本质是个数学 ...

  7. LeetCode 365. 水壶问题

    365. 水壶问题 题目链接-365. 水壶问题 解题思路 裴蜀定理 裴蜀等式:若a,ba,ba,b是整数,且gcd(a,b)=dgcd(a,b)=dgcd(a,b)=d,那么对于任意的整数x,yx, ...

  8. LeetCode 365水壶问题(python)

    题目描述: 有两个容量分别为 x升 和 y升 的水壶以及无限多的水.请判断能否通过使用这两个水壶,从而可以得到恰好 z升 的水? 如果可以,最后请用以上水壶中的一或两个来盛放取得的 z升 水. 你允许 ...

  9. 每日一题-leetcode 365. 水壶问题

    有两个水壶,容量分别为 jug1Capacity 和 jug2Capacity 升.水的供应是无限的.确定是否有可能使用这两个壶准确得到 targetCapacity 升. 如果可以得到 target ...

  10. LeetCode 每日一题 365.水壶问题

    有两个容量分别为 x升 和 y升 的水壶以及无限多的水.请判断能否通过使用这两个水壶,从而可以得到恰好 z升 的水? 如果可以,最后请用以上水壶中的一或两个来盛放取得的 z升 水. 你允许: 装满任意 ...

最新文章

  1. react 错误边界_React with GraphQL和错误边界中的自定义错误页面
  2. php和python区别-python与php比较
  3. tensorflow对应的cudnn、cuda版本
  4. C#求数组中元素的全排列
  5. 人工智障学习笔记——强化学习(5)DRL与DQN
  6. 马斯克造“超级WiFi”这事儿未必能成
  7. Linux知识--初始linux
  8. winxp计算机语言改为英语,系统之家xp系统语言设置将英文版改为中文的方法
  9. 奥维地图电脑端手机端不能用了,有没有可替代的地图工具
  10. 网络服务器ssh、ftp、telnet、samba配置总结
  11. java应用程序由若干个_Java应用程序由若干个类所构成,这些类可以在一个源文件中,也可以分布在若干个源文件中。...
  12. 单因素方差分析 OR 重复测量方差分析
  13. canvas 画正方形和圆形
  14. 支付宝生活号开发中所遇到的困难及解决记录
  15. 如何提高一个网站的排名?
  16. 如何打开.pt文件?
  17. 安卓obb文件的使用进阶
  18. JQ input框单多图上传
  19. 《科学之路》| 图灵奖得主杨立昆人工智能十问:AI会统治人类吗?
  20. (转载)你真的理解Android AIDL中的in,out,inout么?

热门文章

  1. ion-infinite-scroll上拉加载 ion-refresher下拉刷新
  2. Unbalanced calls to begin/end appearance transitions for
  3. 不同内核浏览器的差异以及浏览器渲染简介(转)
  4. Caused by: java.lang.IllegalStateException: No ServletContext set
  5. 常见硬件通信协议介绍
  6. typescript常用编译结果函数__decorate、__matadata、__param、__awaiter
  7. 漂亮的JQUERY SLIDESHOW 磨砂玻璃背景
  8. javaScript开源大全
  9. 在MVC项目中设置启动页
  10. vscode 如何快速跳出括号