问题:

You are given two jugs with capacities x and y litres. There is an infinite amount of water supply available. You need to determine whether it is possible to measure exactly z litres using these two jugs.

If z liters of water is measurable, you must have z liters of water contained within one or both buckets by the end.

Operations allowed:

Fill any of the jugs completely with water.

Empty any of the jugs.

Pour water from one jug into another till the other jug is completely full or the first jug itself is empty.

Example 1: (From the famous "Die Hard" example)

Input: x = 3, y = 5, z = 4

Output: True

Example 2:

Input: x = 2, y = 6, z = 5

Output: False

解决:

【题意】对于example1,有一个容量为3升和一个容量为5升的水罐,问我们如何准确的称出4升的水。先把5升水罐装满水,倒到3升水罐里,这时5升水罐里还有2升水,然后把3升水罐里的水都倒掉,把5升水罐中的2升水倒入3升水罐中,这时候把5升水罐装满,然后往此时有2升水的3升水罐里倒水,这样5升水罐倒出1升后还剩4升即为所求。

https://discuss.leetcode.com/topic/49751/clear-explanation-of-why-using-gcd

① 这道问题其实可以转换为有一个很大的容器,我们有两个杯子,容量分别为x和y,问我们通过用两个杯子往里倒水,和往出舀水,问能不能使容器中的水刚好为z升。那么我们可以用一个公式来表达:

z = m * x + n * y

其中m,n为舀水和倒水的次数,正数表示往里舀水,负数表示往外倒水。

题目中的例子可以写成: 4 = (-2) * 3 + 2 * 5,即3升的水罐往外倒了两次水,5升水罐往里舀了两次水。那么问题就变成了对于任意给定的x,y,z,存不存在m和n使得上面的等式成立。

根据裴蜀定理,ax + by = d的解为 d = gcd(x, y),那么我们只要只要z % d == 0,上面的等式就有解,所以问题就迎刃而解了,我们只要看z是不是x和y的最大公约数的倍数就行了,别忘了还有个限制条件x + y >= z,因为x和y不可能称出比它们之和还多的水。

class Solution { //0ms

public boolean canMeasureWater(int x, int y, int z) {

return z == 0 || (x + y >= z && (z % gcd(x,y)) == 0);

}

public int gcd(int x,int y){

return y == 0 ? x : gcd(y,x % y);

}

}

java杯子换水_水壶问题(向水壶中倒z升水) Water and Jug Problem相关推荐

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

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

  2. java人民币换欧元_关于java:用于存储货币汇率的设计

    我已经开始了一个信贷管理的新项目,现在我不得不处理货币兑换. (例如,欧元->美元)因此,我做了一些头脑风暴,并得到了以下信息: 货币是抽象的,每种新货币都是接口的实现 建立了一个汇率类别,该汇 ...

  3. java一键换壁纸_【Java】Java批量下载必应壁纸工具

    [Java] 纯文本查看 复制代码package com.ren; import java.io.BufferedOutputStream; import java.io.File; import j ...

  4. 三星老java手机换字体_三星手机设置字体大小与更换默认字体的图文教程

    三星手机怎么设置字体大小?不管是我们的三星手机又或者是其他牌子的手机,手机上的一些功能都是可以自己进行更改或者自己做相关设置操作的:就比如最近有三星手机用户,反映自己不喜欢手机上的默认字体,想要自己设 ...

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

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

  6. 6.M设想有三个碗。A碗(8升容量)里有5升水。B碗(5升容量)里有3升水。C碗(3升容量)里有2升水。 你能只倒两次而准确地量出1升水吗?

    问题:设想有三个碗,A碗(8升容量)里有5升水,B碗(5升容量)里有3升水,C碗(3升容量)里有2升水,你能只倒两次而准确地量出1升水吗? 1. 从A碗倒1升水到C碗.那么A碗里有4升水,C碗里满的( ...

  7. 有趣的三个水桶等分8升水问题

    有三个容积分别为3升.5升.8升的水桶,其中容积为8升的水桶中装满了水,容积为3升和容积为5升的水桶都是空的.三个水桶都没有刻度,现在需要将大水桶中的8升水等分成两份,每份都是4升水,附加条件是只能这 ...

  8. 关于使用一个5升容器和一个6升容器量出3升水的一点解决办法

    关于使用一个5升容器和一个6升容器量出3升水的一点解决办法 我想的方法主要有两个: 第一种方法: 1. 将6升的容器装满水,并将5升水倒到5升的容器里面,6升的容器中现在剩水1升. 2.把5升容器中的 ...

  9. 2.你有三个碗:分别是8,5,3公升容量。你能用最少的次数倒出两个四升水吗?

    问:你有三个碗:分别是8,5,3公升容量.你能用最少的次数倒出两个四升水吗? 从8升碗里倒5升水到5升碗里 从5升碗里倒3升水到3升碗里 把3升水倒回8升碗里 把5升碗里剩下的2升水倒进3升碗里 从8 ...

  10. 三个水桶等分8升水的问题 -《算法的乐趣》

    智力题目 有三个容积分别为3升.5升.8升的水桶,其中容积为8升的水桶中装满了水,容积为3升和容积为5升的水桶都是空的.三个水桶都没有刻度,现在需要将大水桶中的8升水等分成两份,每份都是4升水,附加条 ...

最新文章

  1. 归根到底,大家都是出来卖的!有的人月入十万,有的人月入三千!差距!
  2. spring mvc框架设计与实现
  3. 【测试面试题】显示输入数字中的最大值
  4. Sublime Text 3搭建前端环境
  5. idea配置远程服务器实现远程编辑文件及ssh连接
  6. 宏BOOST_CHECK_EXCEPTION用法的测试程序
  7. 配置docker静态IP地址
  8. .NET Core实战项目之CMS 第十章 设计篇-系统开发框架设计
  9. nodemanager_如何使用NodeManager来控制WebLogic Server
  10. 随想录(一种powerpc编译学习的方法)
  11. 一些机器学习(Machine Learning)的网站总结
  12. 20155334 2016-2017-2 《Java程序设计》第三周学习总结
  13. HBase的rowKey设计技巧
  14. JavaScript实现汉字转拼音功能
  15. DDR的VTT电源应用及其优化
  16. 【书法】楷书-颜体 vs 欧体
  17. Pycharm: ImportError: attempted relative import with no known parent package解决方案
  18. Linux的安装(手把手一步一步教学)
  19. 【算法基础】一维前缀和 + 二维前缀和
  20. 用XMind做读书笔记的方法

热门文章

  1. QLabel显示QImage时报错
  2. 如何用python做软件导出cad_使用python将cad批量导出至pdf
  3. SAP FI 系列 007:会计科目主数据维护
  4. QQ分享功能实现-Android
  5. abp框架 mysql_ABP框架使用Mysql数据库
  6. 开源协议及应用 (BSD/GPL/LGPL/Apache/MIT)
  7. 新域名后缀的主要优点是什么?
  8. python连接oracle报错:DatabaseError: DPI-1047: Cannot locate a 64-bit Oracle Client library: “
  9. 如何提高机器学习模型预测准确率
  10. C语言在链表里存储线段,C语言链表详解课件.ppt