问题链接:点击打开链接
题目:
You are given two jugs with capacities x and y litres. There is an infinite amount of water supply available. You need to determine whether it is possible to measure exactly zlitres using these two jugs.
If z liters of water is measurable, you must have z liters of water contained within one or both buckets by the end.
Operations allowed:
- Fill any of the jugs completely with water.
- Empty any of the jugs.
- Pour water from one jug into another till the other jug is completely full or the first jug itself is empty.
Example 1: (From the famous "Die Hard" example)
Input: x = 3, y = 5, z = 4 Output: True
Example 2:
Input: x = 2, y = 6, z = 5 Output: False
题意:
给定两个容量分别为x和y升的罐子。提供无限容量的水。你需要判断用这两个罐子是否可以恰好量出z升的体积。到最后量出的z升体积可以由一到两个罐子装着。
允许的操作包括:
1、将任意罐子灌满。
2、将任意罐子清空。
3、将任意罐子的水倒入另一个罐子,直到另一个罐子倒满或者自己为空为止。
思路:
求最大公约数GCD(Greatest Common Divisor)。
如果x与y互质(最大公约数为1),则容量范围[1, max(x, y)]之内的任意整数体积均可以通过适当的操作得到。
否则,记x与y的最大公约数为gcd,则可以获得的容量z只能为gcd的整数倍,且z <= max(x, y)。
代码:0ms
public class Solution { public boolean canMeasureWater(int x, int y, int z) { //最后可量的水可以装在一个或者两个罐子内 if (x+y<z) return false; //x或者y为0的情况 if (x==z || y==z || x+y==z) return true; //利用得到的最大公约数 return z%GCD(x, y) == 0; } //得到最大公约数 public static int GCD(int a, int b){ while (b != 0) { int temp = b; b = a%b; a = temp; } return a; } }代码:0ms
public class Solution { public boolean canMeasureWater(int x, int y, int z) { //最后可量的水可以装在一个或者两个罐子内 if (x+y<z) return false; //x或者y为0的情况 if (x==z || y==z || x+y==z) return true; //利用得到的最大公约数 return z%GCD(x, y) == 0; } //得到最大公约数 public static int GCD(int a, int b){ return b==0 ? a : GCD(b, a%b); } }