js + leetcode刷题:No.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

来源:力扣(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)
}
发布了67 篇原创文章 · 获赞 8 · 访问量 6338

猜你喜欢

转载自blog.csdn.net/qq_34425377/article/details/105012767