题目
- 水壶问题
有两个容量分别为 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
代码
/*
*/
public class Solution {
public static boolean canMeasureWater(int x, int y, int z) {
//两个x升和y升的水壶,凑得z升的水
//如果x-y的绝对值正好等于z,那就好办直接返回true
if(x+y<z)
return false;
if(Math.abs(x-y)==z)
return true;
//如果不等呢?
//比如 3,5,4
//x(3)->y(0)=x(0)y(3) 3升 得到两升的空间, x(3)y(3)=x(1)y(5)再x满上 倒入y,x剩下1升
//y倒掉 x(1)->y(0)=y(1);
//x(3)->y(1)=y(4); OK
//xy两水壶的容量,可以凑出那些基本的数字
//例如 x=3,y=5,可以凑出0,1,2,3,5
//这组数据中,存在两个数之和等于z,则成功,为true
//参考了博客园 https://www.cnblogs.com/ColaHua/p/12488916.html
//结论: 只要z是x和y的最大的公因子的倍数即可
if(z%(gcd(x,y))==0)//求最大公因子
return true;
return false;
}
private static int gcd(int x, int y) {
return y==0?x:gcd(y,x%y);
}
public static void main(String[] args) {
// TODO Auto-generated method stub
System.out.println(canMeasureWater(2,6,5));
}
}