399. 除法求值
給出方程式 a / b = k, 其中 a 和 b 均為用字串表示的變數, k 是乙個浮點型數字。根據已知方程式求解問題,並返回計算結果。如果結果不存在,則返回 -1.0。
示例 :
給定 a / b = 2.0, b / c = 3.0
問題: a / c = ?, b / a = ?, a / e = ?, a / a = ?, x / x = ?
返回 [6.0, 0.5, -1.0, 1.0, -1.0 ]
輸入為: vector> equations, vector& values, vector> queries(方程式,方程式結果,問題方程式), 其中 equations.size() == values.size(),即方程式的長度與方程式結果長度相等(程式與結果一一對應),並且結果值均為正數。以上為方程式的描述。 返回vector型別。
基於上述例子,輸入如下:
equations(方程式) = [ [「a」, 「b」], [「b」, 「c」] ],
values(方程式結果) = [2.0, 3.0],
queries(問題方程式) = [ [「a」, 「c」], [「b」, 「a」], [「a」, 「e」], [「a」, 「a」], [「x」, 「x」] ].
輸入總是有效的。你可以假設除法運算中不會出現除數為0的情況,且不存在任何矛盾的結果。
下面是powcai大佬的題解**
# dfs
class
solution
:def
calcequation
(self, equations: list[list[
str]
], values: list[
float
], queries: list[list[
str]])
-> list[
float]:
from collections import defaultdict
#建立連線關係圖定義
graph = defaultdict(
set)
#這裡使用集合,因為不會有重複的元數
weights = defaultdict(
)#權重的對應集合關係
lookup =
#查詢表,防止dfs陷入迴圈
#建圖for idx, equ in
enumerate
(equations)
: graph[equ[0]
].add(equ[1]
) graph[equ[1]
].add(equ[0]
) weights[
(equ[0]
, equ[1]
)]= values[idx]
weights[
(equ[1]
, equ[0]
)]=1.0
/values[idx]
#dfs
defdfs
(start, end, visited)
:#當圖中有這個關係連線的時候,直接返回
if(start, end)
in weights:
return weights[
(start, end)
]#當起點或者終點不在圖內的時候,返回0
if start not
in graph or end not
in graph:
return
0#已經訪問過的點不能繼續訪問,陷入迴圈
if start in visited:
return
0#兩個點都在圖內,且起始點(遞迴過後的每乙個點)此時沒被訪問過
visited.add(start)
res =
0for tmp in graph[start]
: res = dfs(tmp, end, visited)
* weights[
(start, tmp)
]#如果某一條邊的權重不為0,那麼加入到權重列表,方便下次查詢
if res !=0:
weights[
(start, end)
]= res
break
visited.remove(start)
return res
#開始計算
res =
for que in queries:
tmp = dfs(que[0]
, que[1]
,set()
)if tmp ==0:
tmp =
-1.0
return res
# bfs
defcalcequation
(self, equations, values, queries)
:from collections import defaultdict, deque
graph = defaultdict(
set)
weight = defaultdict(
) lookup =
# 建圖
for idx, equ in
enumerate
(equations)
: graph[equ[0]
].add(equ[1]
) graph[equ[1]
].add(equ[0]
) weight[
tuple
(equ)
]= values[idx]
weight[
(equ[1]
, equ[0]
)]=float(1
/ values[idx]
) res =
for start, end in queries:
if(start, end)
in weight:
(start, end)])
continue
if start not
in graph or end not
in graph:-1
)continue
if start == end:
1.0)
continue
stack = deque(
)# 將從start點可以到達下乙個節點壓入棧內
for tmp in graph[start]
:(tmp, weight[
(start, tmp)])
)# 記錄訪問節點
visited =
# 為了跳出雙迴圈
flag =
false
while stack:
c, w = stack.pop(
)if c == end:
flag =
true
break
visited.add(c)
for n in graph[c]
:if n not
in visited:
weight[
(start, n)
]= w * weight[
(c, n)
](n, w * weight[
(c, n)])
)if flag:
continue
-1.0
)return res
leetcode399 除法求值
給出方程式 a b k,其中 a 和 b 均為代表字串的變數,k 是乙個浮點型數字。根據已知方程式求解問題,並返回計算結果。如果結果不存在,則返回 1.0。示例 給定 a b 2.0,b c 3.0 問題 a c b a a e a a x x 返回 6.0,0.5,1.0,1.0,1.0 輸入為 ...
leetcode 399 除法求值
查詢改進 給出方程式 a b k,其中 a 和 b 均為用字串表示的變數,k 是乙個浮點型數字。根據已知方程式求解問題,並返回計算結果。如果結果不存在,則返回 1.0。示例 給定 a b 2.0,b c 3.0 問題 a c b a a e a a x x 返回 6.0,0.5,1.0,1.0,1....
帶權並查集 Leetcode 399 除法求值
構建帶權值邊的並查集,對於每個方程式有兩種情況 查詢是否聯通,若不聯通,則答案為 1.0 若聯通,則求出其與根相除的結果,根據結果計算方程式。例如,對於題目示例 構造並查集 a b c,其中a b的邊的權值為2.0,b c的邊的權值為3.0 以計算b a時為例,以root結點為橋梁,計算b a的值 ...