365. Water and Jug Problem

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 z litres 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:

Input: x = 3, y = 5, z = 4
Output: True
Example 2:

Input: x = 2, y = 6, z = 5
Output: False

Solution:

思路:
這道問題其實可以轉換為有一個很大的容器,我們有兩個杯子,容量分別為x和y,問我們通過用兩個杯子往里倒水,和往出舀水,問能不能使容器中的水剛好為z升。那么我們可以用一個公式來表達:
z = m * x + n * y
其中m,n為舀水和倒水的次數(shù),正數(shù)表示往里舀水,負數(shù)表示往外倒水,那么題目中的例子可以寫成: 4 = (-2) * 3 + 2 * 5,即3升的水罐往外倒了兩次水,5升水罐往里舀了兩次水。那么問題就變成了對于任意給定的x,y,z,存不存在m和n使得上面的等式成立。根據(jù)裴蜀定理,ax + by = d的解為 d = gcd(x, y),那么我們只要只要z % d == 0,上面的等式就有解,所以問題就迎刃而解了,我們只要看z是不是x和y的最大公約數(shù)的倍數(shù)就行了,別忘了還有個限制條件x + y >= z,因為x和y不可能稱出比它們之和還多的水,

Time Complexity: O() Space Complexity: O(1)

Solution Code:

class Solution {
    public boolean canMeasureWater(int x, int y, int z) {
        //limit brought by the statement that water is finallly in one or both buckets
        if(x + y < z) return false;
        //case x or y is zero
        if( x == z || y == z || x + y == z ) return true;

        //get GCD, then we can use the property of Bézout's identity
        return z%GCD(x, y) == 0;
    }

    public int GCD(int a, int b){
        while(b != 0 ){
            int temp = b;
            b = a%b;
            a = temp;
        }
        return a;
    }
}
最后編輯于
?著作權歸作者所有,轉載或內(nèi)容合作請聯(lián)系作者
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內(nèi)容