zoukankan      html  css  js  c++  java
  • Leetcode: 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"] ]. 
    The input is always valid. You may assume that evaluating the queries will result in no division by zero and there is no contradiction.

    Graph, DFS

    (1) Build the map, the key is dividend, the value is also a map whose key is divisor and value is its parameter. For example, a / b = 2.0, the map entry is <"a", <"b", 2.0>>. To make searching and calculation easier, we also put b / a = 0.5 into the map.
    (2) for each query, use DFS to search divisors recursively

     1 public class Solution {
     2     public double[] calcEquation(String[][] equations, double[] values, String[][] queries) {
     3         double[] res = new double[queries.length];
     4         HashMap<String, HashMap<String, Double>> map = new HashMap<String, HashMap<String, Double>>();
     5         for (int i=0; i<equations.length; i++) {
     6             String[] equation = equations[i];
     7             double value = values[i];
     8             if (!map.containsKey(equation[0])) {
     9                 map.put(equation[0], new HashMap<String, Double>());
    10                 map.get(equation[0]).put(equation[0], 1.0);
    11             }
    12             if (!map.containsKey(equation[1])) {
    13                 map.put(equation[1], new HashMap<String, Double>());
    14                 map.get(equation[1]).put(equation[1], 1.0);
    15             }
    16             map.get(equation[0]).put(equation[1], value);
    17             map.get(equation[1]).put(equation[0], 1/value);
    18         }
    19 
    20         for (int j=0; j<queries.length; j++) {
    21             res[j] = -1.0; //initialize
    22             dfs(map, queries[j][0], queries[j][1], new HashSet<String>(), res, j, 1.0);
    23         }
    24         return res;
    25     }
    26     
    27     public void dfs(HashMap<String, HashMap<String, Double>> map, String src, String dest, HashSet<String> visited, double[] res, int index, double pathVal) {
    28         if (!map.containsKey(src) || !map.containsKey(dest)) {
    29             res[index] = -1.0;
    30             return;
    31         }
    32         if (visited.contains(src)) return;
    33         HashMap<String, Double> srcNb = map.get(src);
    34         if (srcNb.containsKey(dest)) {
    35             res[index] = pathVal * srcNb.get(dest);
    36             return;
    37         }
    38         visited.add(src);
    39         for (Map.Entry<String, Double> entry : srcNb.entrySet()) {
    40             String neibor = entry.getKey();
    41             dfs(map, neibor, dest, visited, res, index, pathVal*entry.getValue());
    42         }
    43         visited.remove(src);
    44     }
    45 }
  • 相关阅读:
    STM32的“外部中断”和“事件”区别和理解
    非线性函数的最小二乘拟合——兼论Jupyter notebook中使用公式 [原创]
    Jupyter 快捷键总结
    自制导纳信号发生器 [原创cnblogs.com/helesheng]
    Verilog HDL数组(存储器)操作
    一个有趣的异步时序逻辑电路设计实例 ——MFM调制模块设计笔记
    用NI的数据采集卡实现简单电子测试之6——数字I/O及测试平台
    用NI的数据采集卡实现简单电子测试之5——压控振荡器的测试
    用NI的数据采集卡实现简单电子测试之4——半导体温度传感器
    黑客用我们服务器挖矿了
  • 原文地址:https://www.cnblogs.com/EdwardLiu/p/6124304.html
Copyright © 2011-2022 走看看