思路一:裴蜀定理-數學法
由題意,每次操作只會讓桶裡的水總量增加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,...