这里是题目描述:LeetCode-365.水壶问题

方法一:广度优先搜索

对于容量分别为x和y的水壶h1、h2,我们将两水壶分别有v1和v2升水作为一种状态,可以从当前状态出发经过一定操作(倒水、装水等)时两水壶水量变化到达下一个状态。当到达状态v1+v2=z时,就可以返回true。

我们将两水壶的某一状态看做图中的节点,将可能的倒水装水操作看做节点之间的路径。可以从v1=0、v2=0的节点出发,通过图的搜索算法求得结果

我们选用广度优先搜索,原因在于相比于深度优先搜索,广度优先搜索有“水滴波纹扩散”特性,有利于寻找到达某一节点的最短路径。为了避免重复搜索节点造成死循环,我们使用一个HashSet记录已经搜索过的节点,当遇到HashSet中已有的节点,则不进行搜索操作

根据题干,我们在搜索时可以采取的操作有:

  1. h1装满水
  2. h2装满水
  3. h1倒空
  4. h2倒空
  5. h1向h2倒水
  6. h2向h1倒水
    其中操作5和操作6还需区分倒满还有剩水(倒不完)和可以倒完
广度优先搜索代码
class Solution {//采用广度优先搜索解决public boolean canMeasureWater(int x, int y, int z) {if(z==0){return true;}if(z<0 || z>x+y){return false;}HashSet<String> visited=new HashSet<>(); //记录两水壶中有若干水的某一状态是否已经遍历过Queue<State> queue=new LinkedList<>(); //用于广度优先搜索的队列queue.offer(new State(0,0)); //初始状态,两个水壶都为空while(!queue.isEmpty()){State curState=queue.remove();if(visited.contains(curState.curWater[0]+" "+curState.curWater[1])) //该状态已经被遍历过{continue;}visited.add(curState.curWater[0]+" "+curState.curWater[1]);if(curState.curWater[0]+curState.curWater[1]==z){return true;}//开始以当前状态广度优先地进行几种操作int[] water={curState.curWater[0],curState.curWater[1]};queue.offer(new State(x,water[1])); //1号杯装满queue.offer(new State(water[0],y)); //2号杯装满queue.offer(new State(0,water[1])); //1号杯倒空queue.offer(new State(water[0],0)); //2号杯倒空if((y-water[1])>=water[0]) //1号杯向2号杯倒水{queue.offer(new State(0,water[1]+water[0]));}else{queue.offer(new State(water[0]-(y-water[1]),y));}if((x-water[0])>=water[1]) //2号杯向1号杯倒水{queue.offer(new State(water[0]+water[1],0));}else{queue.offer(new State(x,water[1]-(x-water[0])));}}return false;}
}
class State //存储水壶x、水壶y分别有若干升水的状态,以及此状态是否被遍历过
{int[] curWater;public State(int w1,int w2){this.curWater=new int[2];this.curWater[0]=w1;this.curWater[1]=w2;}
}

方法二:裴蜀定理

我们还可以使用数学的方法解此题:当容量为x、y的两水壶可以获得z升的水,则有ax+by=z,其中a、b均为整数。证明:

以x=3,y=5为例,当有ax+by=z,a=-2,b=2,表示需要将壶2接满两次水,壶1满壶状态下倒空两次:将壶2接满第一次,有5升水;壶2倒入壶1,壶2剩余2升水,壶1第一次倒空;将壶2的水倒入壶1,壶1有2升水,壶2空;将壶2接满第二次;将壶2的水倒入壶1,壶2剩余4升水;将壶1第二次倒空;于是就剩下了壶2的4升水

接下来我们说明裴蜀定理:设 d=gcd(a,b),那么对于方程 ax+by=d,一定存在一组整数解。并且对于方程 ax+by=z,如果满足 z%d==0,那么方程一定有整数解,否则无整数解。

因此我们用辗转相除法求得x和y的最大公约数d,若z%d==0,则ax+by=z有整数解,否则没有

裴蜀定理数学方法求解代码
class Solution {public boolean canMeasureWater(int x, int y, int z) {return z==0 || (x+y>=z && z%gcd(x,y)==0);}int gcd(int x,int y) //辗转相除求最大公约数{return y==0?x:gcd(y,x%y);}
}

LeetCode-365.水壶问题 广度优先搜索、费蜀定理相关推荐

  1. LeetCode 365. 水壶问题

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

  2. Leetcode.365 水壶问题

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

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

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

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

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

  5. LeetCode 365水壶问题(python)

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

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

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

  7. Leetcode 365.水壶问题

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

  8. LeetCode——365.水壶问题【贝祖定理】

    题解 AC-Code using PII = pair<int, int>;class Solution {public:bool canMeasureWater(int x, int y ...

  9. leetcode:365. 水壶问题【肥鼠定理,栈模拟dfs】

    分析:数学 显然最后的z是a和b的线性组合 也就是ax + by = z也就是说z是(a,b)的倍数 那就直接用gcd就好了 加个特判 ac code class Solution:def canMe ...

最新文章

  1. 9月第1周安全回顾 IM安全威胁严重 企业增加无线安全投入
  2. 一、把握 Netty 整体架构脉络
  3. 【转】CentOS 6.6 升级GCC G++ (当前最新版本为v6.1.0) (完整)
  4. java indexof方法_【3-14】Java中集合类list的增删改查
  5. 梯度消失和梯度爆炸_梯度消失梯度爆炸-Gradient Clip
  6. linux下编译libyuv,linux.mk
  7. Flink 1.7 文档翻译活动期待大家的参与 | ApacheCN
  8. read time out解决方法_quot;read-on-writequot; in InnoDB
  9. 华三ap设置无线服务器,H3C无线控制器V5版本配置AP上线的方法
  10. CSR867x — 蓝牙音频发射器方案(支持USB、模拟和SPDIF)
  11. python报错:expected an indented block
  12. 物联网安全综述报告之感知层认证机制
  13. 聚焦Java性能优化 打造亿级流量秒杀系统【学习笔记】01_电商秒杀商品回顾
  14. android摇一摇跳转界面,android摇一摇随机变图片
  15. 杰理之MIDI 解码方式共有 4 种,分别是【篇】
  16. 开发小组共同使用协同文档
  17. 不能装载文档控件。请在检查浏览器的选项中检查浏览器的安全设置_「初级会计报考指南」浏览器问题解决方案...
  18. git命令行修改用户名密码
  19. 一文带你快速入门【哈希表】
  20. 使用SQLmap检测漏洞

热门文章

  1. Cesium调用天地图服务【亲测可用】
  2. mysql between和in_mysql between and、==、in性能实例分析
  3. 市电电压双向越限报警保护器电路设计
  4. Windows Android真机调试无法找到驱动
  5. 构建“以客户为中心”的新型商业模式
  6. 如何选择一个好的域名?自购域名必看
  7. 转载:转载:水平思考:跳出思维定式
  8. go语言介绍和开发环境以及git使用
  9. python行列式值计算程序_解行列式程序 python代码实现
  10. 企业为什么要数字化转型?数字化转型成功的案例有哪些?