365. 水壶问题(华为专题)

Posted 我要出家当道士

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了365. 水壶问题(华为专题)相关的知识,希望对你有一定的参考价值。

目录

1、Question

2、Analysis

3、Code

4、Execution


 1、Question

有两个容量分别为 x升 和 y升 的水壶以及无限多的水。请判断能否通过使用这两个水壶,从而可以得到恰好 z升 的水?

如果可以,最后请用以上水壶中的一或两个来盛放取得的 z升 水。

你允许:

  • 装满任意一个水壶
  • 清空任意一个水壶
  • 从一个水壶向另外一个水壶倒水,直到装满或者倒空

示例 1: 

输入: 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
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

2、Analysis

       我们首先要确定一个前提,对于两个水壶装水肯定是从零加到满,倒水肯定是从满满的倒完(这里不包括两个水壶之间互补),这是因为其他的操作毫无意义。

        所以两个水壶的水量可以用公式  表示,x 和 y 分别表示两个水壶的容量,a 和 b分别表示两个水壶倒水和加水的操作次数(不包括互补)。我们可以不用管两个水壶互补的情况,因为互补并不会改变两个水壶中水的总量。所以问题转变为了能否找到 a 、b 满足公式

        这里可以参考裴蜀定理_百度百科,贝祖定理告诉我们,ax + by = z 有解当且仅当 z 是 x, y 的最大公约数的倍数。

3、Code

int gca(int a, int b){
    if (a > b){
        int tmp = a;
        a = b;
        b = tmp;
    }
    while (a != 0){
        int tmp = b % a;
        b = a;
        a = tmp;
    }
    return b;
}
bool canMeasureWater(int jug1Capacity, int jug2Capacity, int targetCapacity){
    if (jug1Capacity + jug2Capacity < targetCapacity) return false;
    if (jug1Capacity == 0) return jug2Capacity == targetCapacity;
    if (jug2Capacity == 0) return jug1Capacity == targetCapacity;
    return targetCapacity % gca(jug1Capacity, jug2Capacity) == 0;
}

 4、Execution

以上是关于365. 水壶问题(华为专题)的主要内容,如果未能解决你的问题,请参考以下文章

365. 水壶问题

365. 水壶问题(gcd)

java 365.水和水壶Problem.java

LeetCode刷题记录

LeetCode刷题记录

office365华为设置下载authenticator