本文主要是介绍LeetCode 365. 水壶问题(数论),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
Description
有两个容量分别为 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来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/water-and-jug-problem
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
Solution 1
- 欧几里得算法/辗转相除法求最大公约数和最小公倍数
def gcd(a, b): # 欧几里得算法求最大公约数if b == 0:return aelse:return gcd(b, a % b)
def lcm(a, b): # 求最小公倍数return a * b / gcd(a, b)
- 扩展欧几里得算法解二元一次方程
- 贝祖定理判断二元一次方程是否有解
- 线性同余用于产生随机数
本题目可以简化为一个方程,用贝祖定理判断是否有解即可。
class Solution:def canMeasureWater(self, x: int, y: int, z: int) -> bool:if x + y < z:return Falseif x == 0 or y == 0:return z == 0 or x + y == zreturn z % math.gcd(x, y) == 0
这篇关于LeetCode 365. 水壶问题(数论)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!