給出方程式 a / b = k, 其中 a 和 b 均為代表字串的變數, k 是乙個浮點型數字。根據已知方程式求解問題,並返回計算結果。如果結果不存在,則返回 -1.0。個人感覺難度應該設為hard比較合理。示例 :
給定 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的情況,且不存在任何矛盾的結果。
構造乙個雙向圖,比如a/b=2.0,那麼a->b權重2.0,b->a權重0.5,要查的時候就用bfs遍歷,每到乙個新節點,就乘以權重,找到目標節點時返回當前值即可。
首先,我們分析一下要怎麼判斷。沒有出現過的字母直接返回-1.0,然後一樣的字母直接返回1.0。這時就可以計算兩點距離了。
class solution(object):
def calcequation(self, equations, values, queries):
""":type equations: list[list[str]]
:type values: list[float]
:type queries: list[list[str]]
:rtype: list[float]
"""unordered_map={}
n = len(equations)
# python字典中的值為列表或字典的構造方法
for i in range(n):
size = len(unordered_map)
res =
for querie in queries:
vis = set()
return res
def getdist(self, a, b,unordered_map, vis):
if a not in unordered_map or b not in unordered_map:
return -1.0
if a == b:
return 1.0
q=vis.add(a)
ret = -1.0
while q:
t = q.pop()
vis.add(t[0])
if t[0] == b:
ret = t[1]
break
for pr in unordered_map[t[0]]:
c = pr[0]
val = pr[1]
if c not in vis:
return ret
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 除法求值
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....
帶權並查集 Leetcode 399 除法求值
構建帶權值邊的並查集,對於每個方程式有兩種情況 查詢是否聯通,若不聯通,則答案為 1.0 若聯通,則求出其與根相除的結果,根據結果計算方程式。例如,對於題目示例 構造並查集 a b c,其中a b的邊的權值為2.0,b c的邊的權值為3.0 以計算b a時為例,以root結點為橋梁,計算b a的值 ...