Leetcode力扣秋招刷题路-0399

这篇具有很好参考价值的文章主要介绍了Leetcode力扣秋招刷题路-0399。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

从0开始的秋招刷题路,记录下所刷每道题的题解,帮助自己回顾总结

399. 除法求值

给你一个变量对数组 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 由小写英文字母与数字组成

思路

本题题目条件可以转换成图来表示,对于 a / b = value ,我们转化成 graph[a][b] = value 以及 graph[b][a] = 1 / value; 然后我们对于某个所求a / c可以看成求解从顶点a出发找到顶点c的一条路径,使用dfs遍历即可。 思路很简单,具体可以看下代码实现文章来源地址https://www.toymoban.com/news/detail-421863.html

class Solution {
    double[][] graph;
    public double[] calcEquation(List<List<String>> equations, double[] values, List<List<String>> queries) {
        Map<String, Integer> map = new HashMap<>();
        int index = 0;
        // 给字符设置唯一编号
        for (List<String> equation : equations) {
            for (String e : equation) {
                if (!map.containsKey(e)) {
                    map.put(e, index++);
                }
            }
        }
        // 建立邻接矩阵
        graph = new double[index + 1][index + 1];
        index = 0;
        for (List<String> equation : equations) {
            int a = map.get(equation.get(0));
            int b = map.get(equation.get(1));
            double value = values[index++];
            graph[a][b] = value;
            graph[b][a] = 1 / value;
        }
        double[] res = new double[queries.size()];
        for (int i = 0; i < res.length; i++) {
            List<String> tmp = queries.get(i);
            boolean[] vis = new boolean[graph.length];
            // 未存在的顶点
            if (map.get(tmp.get(0)) == null || map.get(tmp.get(1)) == null) {
                res[i] = -1;
                continue;
            }
            int a = map.get(tmp.get(0));
            int b = map.get(tmp.get(1));
            res[i] = dfs(a, b, graph.length, vis);
            // 将得出值的结果添加到邻接矩阵
            if (res[i] != -1 && graph[a][b] == 0) {
                graph[a][b] = res[i];
                graph[b][a] = 1 / res[i];
            }
        }
        return res;
    }
    double dfs(int a, int b, int len, boolean[] vis) {
        if (graph[a][b] != 0) {
            return graph[a][b];
        }
        // 记录遍历过的顶点,防止重复
        vis[a] = true;
        for (int i = 0; i < len; i++) {
            if (!vis[i] && graph[a][i] != 0) {
                double tmp = dfs(i, b, len, vis);
                if (tmp != -1) {
                    return graph[a][i] * tmp;
                }
            }
        }
        return -1;
    }
}

到了这里,关于Leetcode力扣秋招刷题路-0399的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • Leetcode力扣秋招刷题路-0721

    从0开始的秋招刷题路,记录下所刷每道题的题解,帮助自己回顾总结 给定一个列表 accounts,每个元素 accounts[i] 是一个字符串列表,其中第一个元素 accounts[i][0] 是 名称 (name),其余元素是 emails 表示该账户的邮箱地址。 现在,我们想合并这些账户。如果两个账户都有一些共同

    2023年04月27日
    浏览(76)
  • Leetcode力扣秋招刷题路-0447

    从0开始的秋招刷题路,记录下所刷每道题的题解,帮助自己回顾总结 给定平面上 n 对 互不相同 的点 points ,其中 points[i] = [xi, yi] 。回旋镖 是由点 (i, j, k) 表示的元组 ,其中 i 和 j 之间的距离和 i 和 k 之间的欧式距离相等(需要考虑元组的顺序)。 返回平面上所有回旋镖的

    2023年04月22日
    浏览(62)
  • 07 Linux补充|秋招刷题|9月6日

    Linux 结构体内存字节对齐 静态变量static 空指针 结构体内存字节要对⻬: 32位系统:4 8 32;64位系统:8 16 24 字节对⻬:字节对⻬是指在计算机中,各种类型数据按照⼀定的规则在空间上排列,以满⾜硬件平台对存储空间的处理要求。 (1)在修饰变量的时候,static 修饰的静

    2024年02月09日
    浏览(28)
  • 从零开始的力扣刷题记录-第四十天

    题目描述: 给定一个整数 num,将其转化为 7 进制,并以字符串形式输出。 题解: 其实和二进制转换是一样的,除以7取余再倒序取出结果就可以了 代码(Go): 题目描述: 给你两个字符串 s 和 goal ,只要我们可以通过交换 s 中的两个字母得到与 goal 相等的结果,就返回 t

    2024年02月06日
    浏览(29)
  • 从零开始的力扣刷题记录-第四十二天

    题目描述: 给你长度相等的两个字符串 s1 和 s2 。一次 字符串交换 操作的步骤如下:选出某个字符串中的两个下标(不必不同),并交换这两个下标所对应的字符。 如果对 其中一个字符串 执行 最多一次字符串交换 就可以使两个字符串相等,返回 true ;否则,返回 false 。

    2024年02月06日
    浏览(42)
  • 从零开始的力扣刷题记录-第八十七天

    题目描述: 给你一个二叉树的根节点 root ,树中每个节点都存放有一个 0 到 9 之间的数字。 每条从根节点到叶节点的路径都代表一个数字: 例如,从根节点到叶节点的路径 1 - 2 - 3 表示数字 123 。 计算从根节点到叶节点生成的 所有数字之和 。 叶节点 是指没有子节点的节点

    2024年02月07日
    浏览(33)
  • 从零开始的力扣刷题记录-第五十八天

    题目描述: 给你一个 不包含 任何零的整数数组 nums ,找出自身与对应的负数都在数组中存在的最大正整数 k 。 返回正整数 k ,如果不存在这样的整数,返回 -1 。 题解: 哈希表存储负数,再遍历nums对每一个正数去哈希表中查找是否存在对应的负数。存在就更新返回值 代码

    2024年02月09日
    浏览(37)
  • 从零开始的力扣刷题记录-第四十八天

    给你一个下标从 0 开始的数组 nums ,数组大小为 n ,且由 非负 整数组成。 你需要对数组执行 n - 1 步操作,其中第 i 步操作(从 0 开始计数)要求对 nums 中第 i 个元素执行下述指令: 如果 nums[i] == nums[i + 1] ,则 nums[i] 的值变成原来的 2 倍,nums[i + 1] 的值变成 0 。否则,跳过

    2024年02月09日
    浏览(38)
  • 从零开始的力扣刷题记录-第三十九天

    题目描述: 给定一个 无重复元素 的 有序 整数数组 nums 。 返回 恰好覆盖数组中所有数字 的 最小有序 区间范围列表 。也就是说,nums 的每个元素都恰好被某个区间范围所覆盖,并且不存在属于某个范围但不属于 nums 的数字 x 。 列表中的每个区间范围 [a,b] 应该按如下格式输

    2024年02月06日
    浏览(33)
  • 从零开始的力扣刷题记录-第六十二天

    题目描述: 给你一个非负整数数组 nums 。在一步操作中,你必须: 选出一个正整数 x ,x 需要小于或等于 nums 中 最小 的 非零 元素。 nums 中的每个正整数都减去 x。 返回使 nums 中所有元素都等于 0 需要的 最少 操作数。 题解: 由于每次都要减去一个最小的非零元素,可以想

    2024年02月11日
    浏览(37)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包