leetcode 399 除法求值

2021-10-10 00:03:54 字數 3796 閱讀 8678

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的值 ...