365.水壺問題

解題思路

裴蜀定理(或貝祖定理),說明了對任何整數a、b和它們的最大公約數d,關於未知數x和y的線性不定方程(稱爲裴蜀等式):若a,b是整數,且gcd(a,b)=d,那麼對於任意的整數x,y,ax+by都一定是d的倍數,特別地,一定存在整數x,y,使ax+by=d成立。它的一個重要推論是:a,b互質的充要條件是存在整數x,y,使ax+by=1。
對於本題,我們可以認爲每次操作只會給水的總量帶來 x 或者 y 的變化量。因此我們的目標可以改寫成:找到一對整數a,b,使得ax+by=z。而只要滿足 z≤x+y,且這樣的a,b存在,那麼目標就是可以達成的。而貝祖定理告訴我們,ax+by=z有解當且僅當z是x,y的最大公約數的倍數。因此我們只需要找到 x,y的最大公約數並判斷 z 是否是它的倍數即可。
如果gcd(x, y)=k,表示x,y的最大公約數爲k,則必定有整數m,n,使得 mx+ny=k,若z%k==0,則必有常數c,使得c*(mx+ny)=c*k=z。所以本題關鍵就是尋找x與y的最大公約數。注意需要判斷幾種特殊情況。
複雜度分析:
時間複雜度:O(log(min(x,y))),取決於計算最大公約數所使用的輾轉相除法。
空間複雜度:O(1),只需要常數個變量。

代碼

class Solution:
    def canMeasureWater(self, x: int, y: int, z: int) -> bool:
        # 判斷特殊情況
        if x + y < z:
            return False
        if (x==0 or y==0):
            return z==0 or x+y==z
        def gcd(a,b):
            return a if b==0 else gcd(b, a%b)
        k = gcd(x, y)
        return True if z%k==0 else False
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章