LeetCode 399. Evaluate Division–Python-DFS解法
此文首發於我的個人博客:zhang0peter的個人博客
LeetCode題解文章分類:LeetCode題解文章集合
LeetCode 所有題目總結:LeetCode 所有題目總結
題目地址:Evaluate Division - LeetCode
Equations are given in the format A / B = k, where A and B are variables represented as strings, and k is a real number (floating point number). Given some queries, return the answers. If the answer does not exist, return -1.0.
Example:
Given a / b = 2.0, b / c = 3.0.
queries are: a / c = ?, b / a = ?, a / e = ?, a / a = ?, x / x = ? .
return [6.0, 0.5, -1.0, 1.0, -1.0 ].
The input is: vector<pair<string, string>> equations, vector& values, vector<pair<string, string>> queries , where equations.size() == values.size(), and the values are positive. This represents the equations. Return vector.
According to the example above:
equations = [ ["a", "b"], ["b", "c"] ],
values = [2.0, 3.0],
queries = [ ["a", "c"], ["b", "a"], ["a", "e"], ["a", "a"], ["x", "x"] ].
這道題目很好理解,就是有向圖的一個權值問題。
解法是從起點開始,使用DFS,或者BFS遍歷圖,思路跟這道題目很像:LeetCode 207. Course Schedule–有向圖找環–面試算法題–DFS遞歸,拓撲排序迭代–Python
Python-DFS解法如下:
class Solution:
def calcEquation(self, equations: List[List[str]], values: List[float], queries: List[List[str]]) -> List[float]:
graph = {}
for (x, y), v in zip(equations, values):
if x in graph:
graph[x][y] = v
else:
graph[x] = {y: v}
if y in graph:
graph[y][x] = 1/v
else:
graph[y] = {x: 1/v}
def dfs(s, t) -> int:
if s not in graph:
return -1
if t == s:
return 1
for node in graph[s].keys():
if node == t:
return graph[s][node]
elif node not in visited:
visited.add(node) # 添加到已訪問避免重複遍歷
v = dfs(node, t)
if v != -1:
return graph[s][node]*v
return -1
res = []
for qs, qt in queries:
visited = set()
res.append(dfs(qs, qt))
return res