• LeetCode 热题 HOT 100 第七十七天 399. 除法求值 中等题 用python3求解


    题目地址

    给你一个变量对数组 equations 和一个实数值数组 values 作为已知条件,其中 equations[i] = [Ai, Bi] 和 values[i] 共同表示等式 Ai / Bi = values[i] 。每个 Ai 或 Bi 是一个表示单个变量的字符串。

    另有一些以数组 queries 表示的问题,其中 queries[j] = [Cj, Dj] 表示第 j 个问题,请你根据已知条件找出 Cj / Dj = ? 的结果作为答案。

    返回 所有问题的答案 。如果存在某个无法确定的答案,则用 -1.0 替代这个答案。如果问题中出现了给定的已知条件中没有出现的字符串,也需要用 -1.0 替代这个答案。

    注意:输入总是有效的。你可以假设除法运算中不会出现除数为 0 的情况,且不存在任何矛盾的结果。

    示例 1:
    输入:equations = [[“a”,“b”],[“b”,“c”]], values = [2.0,3.0], queries = [[“a”,“c”],[“b”,“a”],[“a”,“e”],[“a”,“a”],[“x”,“x”]]
    输出:[6.00000,0.50000,-1.00000,1.00000,-1.00000]
    解释:
    条件: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 ]

    示例 2:
    输入:equations = [[“a”,“b”],[“b”,“c”],[“bc”,“cd”]], values = [1.5,2.5,5.0], queries = [[“a”,“c”],[“c”,“b”],[“bc”,“cd”],[“cd”,“bc”]]
    输出:[3.75000,0.40000,5.00000,0.20000]

    示例 3:
    输入:equations = [[“a”,“b”]], values = [0.5], queries = [[“a”,“b”],[“b”,“a”],[“a”,“c”],[“x”,“y”]]
    输出:[0.50000,2.00000,-1.00000,-1.00000]

    提示:
    1 <= equations.length <= 20
    equations[i].length == 2
    1 <= Ai.length, Bi.length <= 5
    values.length == equations.length
    0.0 < values[i] <= 20.0
    1 <= queries.length <= 20
    queries[i].length == 2
    1 <= Cj.length, Dj.length <= 5
    Ai, Bi, Cj, Dj 由小写英文字母与数字组成
    在这里插入图片描述
    在这里插入图片描述

    解法:图+深度优先dfs(先构造图再dfs)
    参考:指路

    解题思路:
    先构造图,使用dict实现,其天然的hash可以在in判断时做到O(1)复杂度。
    对每个equation如"a/b=v"构造a到b的带权v的有向边和b到a的带权1/v的有向边,
    之后对每个query,只需要进行dfs并将路径上的边权重叠乘就是结果了,如果路径不可达则结果为-1。

    代码实现:

    class Solution:
        def calcEquation(self, equations: List[List[str]], values: List[float], queries: List[List[str]]) -> List[float]:
            # 构造图,equations的第一项除以第二项等于value里的对应值,第二项除以第一项等于其倒数
            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}
            
            # dfs找寻从s到t的路径并返回结果叠乘后的边权重即结果
            def dfs(s, t) -> int:
                if s not in graph:
                    return -1
                if t == s:
                    return 1
                for node in graph[s].keys():
                    #print('graph[s]:',graph[s])
                    #print('graph[s].keys():',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
    
            # 逐个计算query的值
            res = []
            for qs, qt in queries:
                visited = set() #注意每次循环visited都会先清空
                res.append(dfs(qs, qt))
            return res
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
  • 相关阅读:
    【JAVA并发】二、JAVA是如何解决并发问题的
    开发知识点-Python-virtualenv
    MQ 消息丢失、重复、积压问题,如何解决?
    【漏洞复现】WordPress_Wholesale_Market admin-ajax.php 任意文件读取漏洞
    Nginx安装
    listbox控件响应鼠标右键消息
    2023-5-27第二十七天
    Pytest教程:一种利用 Python Pytest Hook 机制的软件自动化测试网络数据抓包方法
    【JDBC笔记】PreparedStatement通用查询数据表
    python--短路运算,把0、空字符串和None看成 False,其他数值和非空字符串都看成 True
  • 原文地址:https://blog.csdn.net/weixin_40634691/article/details/126446855