小菜鸟的第一篇博客从LeetCode开始!
2020-3-21 365_水壶问题(中等)
思路来自-LeetCode官方
题目:水壶问题题目描述
思路:数学方法实现
预备知识:裴蜀定理(贝祖定理)
-
裴蜀定理:
其是一个关于最大公约数的定理。
该定理说明了对任何整数a、b和它们的最大公约数d,关于未知数x和y的线性丢番图方程:若a,b是整数,且gcd(a,b)= d,那么对于任意的整数x,y,ax+by都一定是d的倍数,一定存在整数x,y,使ax+by=d成立。 -
重要推论
a,b互质的冲要条件是存在整数x,y,使ax+by=1.
题目解读:
- 在题目所给的操作下,两个桶不能同时有水且不满。
- 每次操作只会让桶里的水总量增加x,增加y,减少x,减少y。
- 354的倒法:
①先装满5L的B水壶,将5L中的3L倒入A水壶;(A—>3,B–>2)
②将A水壶中的水全部倒出,B水壶中的水倒入A壶;(A–>空—>2L , B—>0L)
③将B水壶装满;(B–>5L)
④将B中的水倒入A,将A装满; (A—>3,B—>4)
以上可知,现要找到一对整数a,b,使得
ax+by =z
要满足 z =<x+y ,.在本题中,需要找到x ,y的最大公约数并判断z是否是它的倍数即可。
Java解法:
class Solution {
public boolean canMeasureWater(int x, int y, int z) {
if( x==0 && y ==0 )
return z==0;
return z == 0 || (z % gcd ( x ,y )== 0 && x+y >= z);
}
static int gcd(int x,int y){ // 辗转相除法
return y == 0 ? x : gcd ( y , x % y ) ;
}
}
C++:
class Solution {
public:
bool canMeasureWater(int x, int y, int z) {
return z == 0 || (x + y >= z && z % gcd(x, y) == 0);
}
int gcd(int x, int y) {
return y == 0 ? x : gcd(y, x % y);
}
};
LeetCode官方讲解
参考大神代码:365_水壶问题
最后告诉自己的是,求最大公约数很重要!超重要!特重要!代码背都要会背!
奥利给!