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.
class Solution {
public double[] calcEquation(List<List<String>> equations, double[] values, List<List<String>> queries) {
HashMap<String, HashMap<String, Double>> graph = new HashMap<>();
for (int i = 0; i < equations.size(); i++) {
if (!graph.containsKey(equations.get(i).get(0)))
graph.put(equations.get(i).get(0), new HashMap<>());
graph.get(equations.get(i).get(0)).put(equations.get(i).get(1), values[i]);
if (!graph.containsKey(equations.get(i).get(1)))
graph.put(equations.get(i).get(1), new HashMap<>());
graph.get(equations.get(i).get(1)).put(equations.get(i).get(0), (double) (1 / values[i]));
}
double[] ans = new double[queries.size()];
for (int i = 0; i < ans.length; i++) {
ans[i] = getPath(graph, queries.get(i).get(0), queries.get(i).get(1));
}
return ans;
}
public double getPath(HashMap<String, HashMap<String, Double>> graph, String src, String dst) {
if (!graph.containsKey(src) || !graph.containsKey(dst))
return -1.0;
Set<String> visited = new HashSet<>();
Queue<Pair> q = new LinkedList<>();
q.add(new Pair(src, 1));
while (q.size() != 0) {
int size = q.size();
while (size-- > 0) {
Pair node = q.poll();
if (visited.contains(node.str))
continue;
visited.add(node.str);
if (dst.equals(node.str))
return node.value;
for (String neighbor : graph.get(node.str).keySet())
q.add(new Pair(neighbor, node.value * graph.get(node.str).get(neighbor)));
}
}
return -1.0;
}
static class Pair {
String str;
double value;
Pair(String str, double v) {
this.str = str;
value = v;
}
}
}
Last updated