您的位置:首页 > 其它

365. Water and Jug Problem

2016-06-26 14:53 375 查看
题目:

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);
    }
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: