Leetcode 365.水壶问题
水壶问题
有两个容量分别为 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
这是我本科时算法课上到一道经典题。两个瓶子可能量出的水是两个瓶子容量最大公约数的倍数。所以只要判断z是否可以被x,y的最大公约数整除即可。
1 public class Solution { 2 public static boolean canMeasureWater(int x, int y, int z) { 3 if(x==0||y==0) return (z==x||z==y); 4 int n=Math.max(x, y); 5 int m=Math.min(x, y); 6 x=n; 7 y=m; 8 if(z>x+y) 9 return false; 10 if(z==x||z==y) 11 return true; 12 n=fun(x,y); 13 return z%n==0; 14 } 15 //求x,y的最大公约数 16 public static int fun(int x,int y){ 17 if(x%y==0) 18 return y; 19 while(x%y!=0){ 20 int m=Math.max(x-y, y); 21 int n=Math.min(x-y, y); 22 x=m; 23 y=n; 24 } 25 return y; 26 } 27 }