zoukankan      html  css  js  c++  java
  • [LC] 399. Evaluate Division

    Equations are given in the format A / B = k, where A and B are variables represented as strings, and k is a real number (floating point number). Given some queries, return the answers. If the answer does not exist, return -1.0.

    Example:
    Given a / b = 2.0, b / c = 3.0.
    queries are: a / c = ?, b / a = ?, a / e = ?, a / a = ?, x / x = ? .
    return [6.0, 0.5, -1.0, 1.0, -1.0 ].

    The input is: vector<pair<string, string>> equations, vector<double>& values, vector<pair<string, string>> queries , where equations.size() == values.size(), and the values are positive. This represents the equations. Return vector<double>.

    According to the example above:

    equations = [ ["a", "b"], ["b", "c"] ],
    values = [2.0, 3.0],
    queries = [ ["a", "c"], ["b", "a"], ["a", "e"], ["a", "a"], ["x", "x"] ]. 
    class Solution {
        public double[] calcEquation(List<List<String>> equations, double[] values, List<List<String>> queries) {
            Map<String, List<GraphNode>> map = new HashMap<>();
            for (int i = 0; i < equations.size(); i++) {
                List<String> curList = equations.get(i);
                if (!map.containsKey(curList.get(0))) {
                    map.put(curList.get(0), new ArrayList<>());
                }
                map.get(curList.get(0)).add(new GraphNode(curList.get(1), values[i]));
                if (!map.containsKey(curList.get(1))) {
                    map.put(curList.get(1), new ArrayList<>());
                }
                map.get(curList.get(1)).add(new GraphNode(curList.get(0), 1 / values[i]));
            }
            double[] res = new double[queries.size()];
            for (int i = 0; i < queries.size(); i++) {
                List<String> curList = queries.get(i);
                res[i] = find(curList.get(0), curList.get(1), 1, map, new HashSet<>());
            }
            return res;
        }
        
        private double find(String start, String end, double value, Map<String, List<GraphNode>> map, Set<String> visited) {
            if (!map.containsKey(start) || visited.contains(start)) {
                return -1.0;
            }
            if (start.equals(end)) {
                return value;
            }
            visited.add(start);
            for (GraphNode nei: map.get(start)) {
                double result = find(nei.name, end, value * nei.value, map, visited);
                if (result != -1.0) {
                    return result;
                }
            }
            visited.remove(start);
            return -1.0;
        }
    }
    
    class GraphNode {
        String name;
        double value;
        public GraphNode(String name, double value) {
            this.name = name;
            this.value = value;
        }
    }
  • 相关阅读:
    关于路径的小知识点
    转发与重定向
    一种反复的读写文件的方法
    文字排版reportlab
    Qgis中插件的安装位置
    spyder打开文件假死解决
    地图跳跃-超级码力
    尾部的零
    一探torch.nn究竟“What is torch.nn really?”
    KAZE特征和各向异性扩散滤波
  • 原文地址:https://www.cnblogs.com/xuanlu/p/13058403.html
Copyright © 2011-2022 走看看