美文网首页
399. 除法求值

399. 除法求值

作者: justonemoretry | 来源:发表于2021-09-28 09:32 被阅读0次
image.png

解法

并查集的思想,将数组转化为图中的权重边,并进行缩短路径,每个都指向根节点

class Solution {
    public double[] calcEquation(List<List<String>> equations, double[] values, List<List<String>> queries) {
        int size = equations.size();
        // indexMap保存字符串对应的下标映射,方便UnionFind里维护数组
        Map<String, Integer> indexMap = new HashMap(size * 2);
        UnionFind unionFind = new UnionFind(size * 2);
        int index = 0;
        for (int i = 0; i < size; i++) {
            List<String> equation = equations.get(i);
            String v1 = equation.get(0);
            String v2 = equation.get(1);

            if (!indexMap.containsKey(v1)) {
                indexMap.put(v1, index++);
            }
            if (!indexMap.containsKey(v2)) {
                indexMap.put(v2, index++);
            }
            unionFind.union(indexMap.get(v1), indexMap.get(v2), values[i]);
        }

        int queriesSize = queries.size();
        double[] res = new double[queriesSize];
        for (int i = 0; i < queriesSize; i++) {
            List<String> query = queries.get(i);
            String v1 = query.get(0);
            String v2 = query.get(1);
            // 获取映射
            Integer id1 = indexMap.get(v1);
            Integer id2 = indexMap.get(v2);
            if (id1 == null || id2 == null) {
                res[i] = -1.0d;
            } else {
                res[i] = unionFind.isConnected(id1, id2);
            }
        }
        return res;
    }

    private class UnionFind {
        // 父节点是哪个
        private int[] parent;
        // 以当前点为起始点,parent对应的值为终点,对应的权重边
        private double[] weight;

        public UnionFind(int n) {
            this.parent = new int[n];
            this.weight = new double[n];
            for (int i = 0; i < n; i++) {
                parent[i] = i;
                weight[i] = 1.0d;
            }
        }

        // 寻找x对应的根节点,并计算到根节点的权重值
        public int find(int x) {
            if (x != parent[x]) {
                int origin = parent[x];
                parent[x] = find(parent[x]);
                weight[x] *= weight[origin];
            }
            return parent[x];
        }

        public void union(int x, int y, double value) {
            int RootX = find(x);
            int RootY = find(y);
            if (RootX == RootY) {
                return;
            }

            parent[RootX] = RootY;
            weight[RootX] = value * weight[y] / weight[x];      
        }

        public double isConnected(int x, int y) {
            int RootX = find(x);
            int RootY = find(y);
            if (RootX == RootY) {
                return weight[x] / weight[y];
            } else {
                return -1.0d;
            }
        }
    } 
}

相关文章

  • 399. 除法求值

    解法 并查集的思想,将数组转化为图中的权重边,并进行缩短路径,每个都指向根节点

  • 399. 除法求值(Python)

    题目 难度:★★★★☆类型:图方法:深度优先搜索 力扣链接请移步本题传送门更多力扣中等题的解决方案请移步力扣中等题...

  • LeetCode399. 除法求值

    给出方程式 A / B = k, 其中 A 和 B 均为代表字符串的变量, k 是一个浮点型数字。根据已知方程式求...

  • LC399-除法求值

    题目 题目分析 用到的数据结构:map,map的取值,求值。1、遍历得到所有的字母,然后映射成数字。2、将数字组建...

  • 《每周一道算法题》(一)逆波兰表达式求值

    一 逆波兰表达式求值 150. 逆波兰表达式求值 说明: 整数除法只保留整数部分。 给定逆波兰表达式总是有效的。换...

  • iOS算法题(一)逆波兰表达式求值

    一 逆波兰表达式求值 150. 逆波兰表达式求值 说明: 整数除法只保留整数部分。 给定逆波兰表达式总是有效的。换...

  • 多项式求值(利用大除法)

    欢迎关注公z号:沈阳奥数 下面我们看一下大除法在多项式求值的应用 多项式求值 例题:已知x²-2x-1=0,求2x...

  • Swift Collection 中的 lazy 作用

    惰性求值 惰性求值常见于函数式编程中,也有人把惰性求值翻译成延迟求值(Lazy Evaluation)。它的目的是...

  • Python中的优化:惰性求值详解

    惰性求值,也就是延迟求值,表达式不会在它被绑定到变量之后就立即求值,而是等用到时再求值。这个特性可以解决一些巨大甚...

  • Python学习笔记(二)几种除法的比较

    传统除法(' /')、真除法、floor除法(' // ') ·传统除法和真除法:在Python2.7之前,对整数...

网友评论

      本文标题:399. 除法求值

      本文链接:https://www.haomeiwen.com/subject/slbcnltx.html