题目:
有两个容量分别为 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
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
解法:
思路:
将上面的问题转换为数学就是 mx + ny = z的问题,即3m + 5n == 4
如果存在一个常数g使得g(mx+ny) = z = g * k,那么z%k === 0,此时会发现是求x,y的最大公约数。
可联系leetcode 1071
// 按照1071的思路来进行
var canMeasureWater = function(x, y, z){
// 1、处理特殊情况
if(z!== 0 && x+y === z) return true
else if(x+y < z){
return false
}else if(z === 0){
return true
}
// 得出大小值,求出最大公约数
let num1,num2
if(x > y){
num1 = x
num2 = y
}else{
num1 = y
num2 = x
}
// 处理另一种特殊情况
if(num2 === 0) return num1 === z
// z与最大公约数取余,方便判断是否有常数满足条件
return z % gcd(num1, num2) === 0
}
// 最大公约数x,y
var gcd = function(num1, num2){
// 利用辗转相除法(欧几里得算法)来计算最大公约数
return num2 === 0 ? num1: gcd(num2, num1 % num2)
}