399. Evaluate Division

https://leetcode.com/problems/evaluate-division/

solution

  • 非常考察如何建模

class Solution:
    def calcEquation(self, equations: List[List[str]], values: List[float], queries: List[List[str]]) -> List[float]:
        graph = self.build_graph(equations, values)

        res = []
        for x, y in queries:
            if x not in graph or y not in graph:
                res.append(-1)
                continue

            visited = set()
            prod = self.dfs(graph, x, y, 1, visited)  # 关于返回值,开始很久返回都是空. 通过有的返回-1来识别最终返回非-1的那一个
            res.append(prod)
        return res

    def build_graph(self, equations, values):
        graph = collections.defaultdict(dict)  # 带权重
        for equation, value in zip(equations, values):
            x, y = equation
            graph[x][y] = value
            graph[y][x] = 1 / value
        return graph

    def dfs(self, graph, x, y, prod, visited):
        if x == y:
            return prod

        visited.add(x)

        for next, val in graph[x].items():  # 权重图的值还是一个hash
            if next not in visited:
                result = self.dfs(graph, next, y, prod*val, visited)
                if result != -1:  # A path to y is found
                    return result
        return -1  # 这里的-1以及上面的 不等于-1时返回result. 参考树公共祖先, 需要深刻理解递归

时间复杂度:O() 空间复杂度:O()

follow up

1466. Reorder Routes to Make All Paths Lead to the City Zero

  • 类似的建模方式. 同样要注意dfs输出的问题

  • bfs

Last updated