LeetCode 365 水壺問題

2022-06-27 08:51:09 字數 1250 閱讀 4968

思路一:裴蜀定理-數學法

由題意,每次操作只會讓桶裡的水總量增加x或y,或者減少x或y,即會給水的總量帶來x或y的變化量,轉為數字描述即為:找到一對整數a,b使得下式成立:

ax+by=z
分析知,要完成操作,需要滿足:

z<=x+y(a,b存在)
由裴蜀定理:

z是x,y的最大公約數的倍數=>ax+by=z有解
// c++

class solution

};// t(n) = o(log(min(x,y)),即計算最大公約數所使用的輾轉相除法

// s(n) = o(1)

思路二:dfs

對題目進行建模,分析可知,在任意乙個時刻,問題的狀態有兩個數字決定:x壺中的水量,以及y壺中的水量;

可以採取以下操作:

搜尋中的每一步以 remain_x, remain_y 作為狀態,即表示 x 壺和 y 壺中的水量。在每一步搜尋時,我們會依次嘗試所有的操作,遞迴地搜尋下去。但要保證每個狀態至多只被搜尋一次。

# python

class solution:

def canmeasurewater(self, x: int, y: int, z: int) -> bool:

stack = [(0, 0)]

self.seen = set()

while stack:

remain_x, remain_y = stack.pop()

if remain_x == z or remain_y == z or remain_x + remain_y == z:

return true

if (remain_x, remain_y) in self.seen:

continue

self.seen.add((remain_x, remain_y))

# 把 x 壺灌滿。

# 把 y 壺灌滿。

# 把 x 壺倒空。

# 把 y 壺倒空。

# 把 x 壺的水灌進 y 壺,直至灌滿或倒空。

# 把 y 壺的水灌進 x 壺,直至灌滿或倒空。

return false

# t(n) = o(xy),狀態數最多有(x+1)(y+1)種,每一種狀態進行dfs為o(1)

# s(n) = o(xy),set存入狀態數

Leetcode 365 水壺問題

有兩個容量分別為x公升 和y公升的水壺以及無限多的水。請判斷能否通過使用這兩個水壺,從而可以得到恰好z公升 的水?如果可以,最後請用以上水壺中的一或兩個來盛放取得的z公升 水。你允許 示例1 from the famous die hard example 輸入 x 3,y 5,z 4 輸出 tru...

LeetCode365 水壺問題

有兩個容量分別為 x公升 和 y公升 的水壺以及無限多的水。請判斷能否通過使用這兩個水壺,從而可以得到恰好 z公升 的水?如果可以,最後請用以上水壺中的一或兩個來盛放取得的 z公升 水。你允許 裝滿任意乙個水壺 清空任意乙個水壺 從乙個水壺向另外乙個水壺倒水,直到裝滿或者倒空 示例 1 from t...

leetcode 365 水壺問題 規律

365.水壺問題 有兩個容量分別為 x公升 和y公升 的水壺以及無限多的水。請判斷能否通過使用這兩個水壺,從而可以得到恰好 z公升 的水?如果可以,最後請用以上水壺中的一或兩個來盛放取得的 z公升 水。你允許 示例 1 from the famous die hard example 輸入 x 3,...