水壶问题


Leetcode题号: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

题解

本题官方给出了两种解法,一种是深度优先搜索方法,这种方法复杂度较高,第二种是数学方法,这种方法比较有意思,我们着重理解以下这个方法。
数学方法涉及到了裴蜀定理,这个定理在百度百科中的定义如下:

裴蜀定理(或贝祖定理)得名于法国数学家艾蒂安·裴蜀,说明了对任何整数 a、ba、ba、b和它们的最大公约数 ddd,关于未知数 xxx和 yyy的线性不定方程(称为裴蜀等式):若 a,ba,ba,b是整数,且 gcd(a,b)=dgcd(a,b)=dgcd(a,b)=d,那么对于任意的整数 x,y,ax+byx,y,ax+byx,y,ax+by都一定是 ddd的倍数,特别地,一定存在整数 x,yx,yx,y,使 ax+by=dax+by=dax+by=d成立。
它的一个重要推论是:a,ba,ba,b互质的充要条件是存在整数x,yx,yx,y使ax+by=1ax+by=1ax+by=1。

让我们举个例子,例如 a=12,b=8a=12,b=8a=12,b=8,那么有 gcd(a,b)=4gcd(a,b)=4gcd(a,b)=4,按照裴蜀定理有以下推论:所有整数 x,yx,yx,y都可以使 xa+ybxa+ybxa+yb为 444的倍数,而且肯定有 x,yx,yx,y使得 xa+yb=4xa+yb=4xa+yb=4。
可以解一下 12x+8y=412x+8y=412x+8y=4,有3x+2y=13x+2y=13x+2y=1,有 x=1,y=−1x=1,y=-1x=1,y=−1可以满足条件。

分析问题可知,每次操作之后都会有水量变化,总量的变化有以下几种可能

可能性 总水量变化量
从满倒空水壶xxx −x-x−x
从空倒满水壶xxx xxx
从满倒空水壶yyy −y-y−y
从空倒满水壶yyy yyy
从水壶xxx倒入水壶yyy(无论满不满) 000
从水壶yyy倒入水壶xxx(无论满不满) 000
从不满倒空水壶xxx(因为上一步操作后剩余水量也为ax+byax+byax+by) cx+dycx+dycx+dy,其中ccc和ddd是整数
从不满倒空水壶yyy(因为上一步操作后剩余水量也为ax+byax+byax+by) cx+dycx+dycx+dy,其中ccc和ddd是整数

由题目可知,每次操作之后必然有一个壶是满的或空的,因为不管哪一个操作都要到达满或空才会停止。而从不满的一个壶倒空水的时候,总水量是符合ax+byax+byax+by的,其中aaa和bbb是整数,而另一个水壶不是xxx或yyy就是000,那么倒出去的水也是符合cx+dycx+dycx+dy的,其中ccc和ddd是整数。

所以题目中要求判断是否可以达到恰好获得zzz升的水,只需要判断是否存在ax+by=zax+by=zax+by=z即可,由裴蜀定理可知,只要zzz为gcd(x,y)gcd(x,y)gcd(x,y)的倍数,因为存在a,ba,ba,b可以使得ax+by=gcd(x,y)ax+by=gcd(x,y)ax+by=gcd(x,y),设z=m×gcd(x,y)z = m \times gcd(x,y)z=m×gcd(x,y),有 z=m×(ax+by)z =m\times(ax+by)z=m×(ax+by),其中mmm是整数。所以只需要判断zzz是否是gcd(x,y)gcd(x,y)gcd(x,y)的倍数即可。

python实现如下:

class Solution:def canMeasureWater(self, x: int, y: int, z: int) -> bool:if x+y < z: # 如果两个壶的水都不够z那么肯定不可能达到z的水量return Falseif x==0 or y==0: # 如果一个壶的水量为0,那么除非要求水量是0,或者某个壶和水量相等return z==0 or x+y == 0if z%math.gcd(x,y)==0: # 如果z是x和y的最大公约数的倍数,则可以取z的水量return Trueelse: # 其他情况是不能达到的return False

我觉得了解一下裴蜀定理是非常好的,推论 “a,ba,ba,b互质的充要条件是存在整数x,yx,yx,y使ax+by=1ax+by=1ax+by=1”值得记录一下。

365.水壶问题笔记相关推荐

  1. Leetcode.365 水壶问题

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

  2. LeetCode 365. 水壶问题

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

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

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

  4. 365. 水壶问题-暴力模拟倒水过程-递归法

    365. 水壶问题-暴力模拟倒水过程-递归法 有两个水壶,容量分别为 jug1Capacity 和 jug2Capacity 升.水的供应是无限的.确定是否有可能使用这两个壶准确得到 targetCa ...

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

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

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

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

  7. 365 水壶问题(递归、数学-裴蜀定理)

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

  8. LeetCode 365水壶问题(python)

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

  9. 365水壶问题(数学)

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

最新文章

  1. IT职场中外企面试最爱提的问题TOP10
  2. 现代密码学1.2--Kerckhoffs原则
  3. 设置Eclipse中的Courier New字体
  4. 笔记-高项案例题-2019年上-人力资源管理
  5. 环路的产生及RIP防环机制
  6. 一条看似不合理SQL和10个合理的解释
  7. 通过c# 实现自定义属性改变触发自定义事件 ,理解自定义事件及其触发过程
  8. Selenium利用POI读写excel文件
  9. 计算机受限制用户,由于该计算机受到限制,本次操作已被取消的解决办法
  10. 代码评审 16.7.1
  11. 百度文库免费下载方法,亲测可用!建议收藏!
  12. HTTP中的URL长度限制
  13. 浅谈HTTP接口性能测试脚本的编写
  14. linux必备软件合集
  15. 原生开发跟混合开发?两者有什么区别?
  16. 5分钟TypeScript入门
  17. 笔记:美团智能配送系统的运筹优化实战
  18. 国产加密实际运用:使用SM3加盐存储密码,并且使用SM2进行登录认证
  19. 甲午海战北洋水师战败的战术分析
  20. OPTICS聚类以及python实现

热门文章

  1. 如何用java读取并解析geojson文件
  2. 学画画应该需要学习哪些基础
  3. Android OpenGL ES 基础原理
  4. 什么是单元测试(unit testing)
  5. Acwing第72场周赛+Leetcode第314场周赛
  6. 【SVA学习】01. 什么是断言(SVA)?
  7. OPENNI实践-体感方向盘玩赛车游戏(2)
  8. GTP与MBR硬盘分区区别(UEFI介绍)
  9. 和Android的第一次美丽邂逅
  10. 【腾讯TMQ】走进标准化测试