365. 水壶问题(华为专题)
Posted 我要出家当道士
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了365. 水壶问题(华为专题)相关的知识,希望对你有一定的参考价值。
目录
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. 水壶问题(华为专题)的主要内容,如果未能解决你的问题,请参考以下文章