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 }
  • 相关阅读:
    [SDOI2009]学校食堂Dining
    [SCOI2005]最大子矩阵
    [AHOI2009]中国象棋
    洛谷P1850 换教室(概率dp)
    洛谷[1007]梦美与线段树(线段树+概率期望)
    洛谷P3577 [POI2014]TUR-Tourism
    CF1045G AI robots(动态开点线段树)
    洛谷P4721 【模板】分治 FFT(分治FFT)
    洛谷P4726 【模板】多项式指数函数
    洛谷P4173 残缺的字符串(FFT)
  • 原文地址:https://www.cnblogs.com/EdwardLiu/p/6124304.html
Copyright © 2011-2022 走看看