399. Evaluate Division
Medium
You are given an array of variable pairs equations
and an array of real numbers values
, where equations[i] = [Ai, Bi]
and values[i]
represent the equation Ai / Bi = values[i]
. Each Ai
or Bi
is a string that represents a single variable.
You are also given some queries
, where queries[j] = [Cj, Dj]
represents the jth
query where you must find the answer for Cj / Dj = ?
.
Return the answers to all queries. If a single answer cannot be determined, return -1.0
.
Note: The input is always valid. You may assume that evaluating the queries will not result in division by zero and that there is no contradiction.
Example 1:
Input: equations = [["a","b"],["b","c"]], values = [2.0,3.0], queries = [["a","c"],["b","a"],["a","e"],["a","a"],["x","x"]] Output: [6.00000,0.50000,-1.00000,1.00000,-1.00000] Explanation: 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 ]
Example 2:
Input: equations = [["a","b"],["b","c"],["bc","cd"]], values = [1.5,2.5,5.0], queries = [["a","c"],["c","b"],["bc","cd"],["cd","bc"]] Output: [3.75000,0.40000,5.00000,0.20000]
Example 3:
Input: equations = [["a","b"]], values = [0.5], queries = [["a","b"],["b","a"],["a","c"],["x","y"]] Output: [0.50000,2.00000,-1.00000,-1.00000]
Constraints:
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
consist of lower case English letters and digits.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 | class Solution { Map<String, Map<String, Double>> graph = new HashMap<>(); int n; Set<String> visited = new HashSet<>(); public double[] calcEquation(List<List<String>> equations, double[] values, List<List<String>> queries) { n = equations.size(); for(int i=0; i<n; ++i){ String u = equations.get(i).get(0), v = equations.get(i).get(1); double r = values[i]; graph.computeIfAbsent(u, (k->new HashMap<>())).put(v, r); graph.computeIfAbsent(v, (k->new HashMap<>())).put(u, 1/r); } double[] ret = new double[queries.size()]; for(int i=0; i<queries.size(); ++i){ visited.clear(); ret[i] = getWeight(queries.get(i).get(0), queries.get(i).get(1)); } return ret; } double getWeight(String start, String end){ if(!graph.containsKey(start) || !graph.containsKey(end)) return -1.0; visited.add(start); if(graph.get(start).containsKey(end)) return graph.get(start).get(end); for(Map.Entry<String, Double> e : graph.get(start).entrySet()){ String next = e.getKey(); if(visited.contains(next)) continue; double t = getWeight(next, end); if(t!=-1.0) return t*e.getValue(); } return -1.0; } } |
No comments:
Post a Comment