Leetcode 365 水壶问题 (扩展欧几里得)
题目描述:
有两个容量分别为 x升 和 y升 的水壶以及无限多的水。请判断能否通过使用这两个水壶,从而可以得到恰好 z升 的水?如果可以,最后请用以上水壶中的一或两个来盛放取得的 z升 水。
你允许:
- 装满任意一个水壶
- 清空任意一个水壶
- 从一个水壶向另外一个水壶倒水,直到装满或者倒空
题解:
题目允许的三个操作,分别对应+x,+y,+(max(x,y)-min(x,y))。根据贝祖定理(扩展欧几里得)有ax+by=gcd(a,b)。也就是说,如果z为gcd(a,b)的倍数的话,就有解。
由于题目还有一个限制--选择x,y两个水壶中的一个或者两个来盛水。使用x,y最多能够盛x+y升的水,加一个判断就好了。
AC代码:
class Solution { public: int gcd(int x,int y) { if(y == 0) return x; return gcd(y,x%y); } bool canMeasureWater(int x, int y, int z) { int g = gcd(x,y); if(x+y < z ) return false; if(x == 0 && y == 0) { if(z == 0 )return true; return false; } if(x == 0 ) g = y; if(y == 0) g = x; if(z%g == 0) return true; return false; } };