[leetcode]Evaluate Division
除法求值,先建立树,然后使用递归,主要不要进入环。
后来发现x/x = 1.0这条边可以不用,这样只要记录node是不是访问过就可以。
class Solution:
def calcEquation(self, equations: List[List[str]], values: List[float], queries: List[List[str]]) -> List[float]:
adjDict = {} # node -> [adjNodes...]
valueDict = {} # (x, y) -> float
for i in range(len(equations)): # make graph
x, y = equations[i]
if x not in adjDict:
adjDict[x] = set()
# x / y
adjDict[x].add(y)
valueDict[(x, y)] = values[i]
# y / x
if y not in adjDict:
adjDict[y] = set()
adjDict[y].add(x)
valueDict[(y, x)] = 1.0 / values[i]
# itself
adjDict[x].add(x)
valueDict[(x, x)] = 1.0
adjDict[y].add(y)
valueDict[(y, y)] = 1.0
result = []
for query in queries:
visitedQuery = [query]
tmp = self.calValue(query, adjDict, valueDict, visitedQuery)
if tmp is not None:
result.append(tmp)
else:
result.append(-1.0)
return result
# None for not exist
def calValue(self, query, adjDict, valueDict, visitedQuery):
x, y = query
if (x, y) in valueDict:
return valueDict[(x, y)]
if x not in adjDict:
return None
for nextNode in adjDict[x]:
if (nextNode, y) in visitedQuery:
continue
visitedQuery.append((nextNode, y))
tmp = self.calValue((nextNode, y), adjDict, valueDict, visitedQuery)
visitedQuery.pop()
if tmp is not None:
return valueDict[(x, nextNode)] * tmp
return None

浙公网安备 33010602011771号