Problem Statement:
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.
Solution This can be solved using Union+Find on disjoint set, a solution is seen here:
However, I'm not clear on the intuition behind line 59:
rst[i] = uf.rank.get(queries[i][0]) / uf.rank.get(queries[i][1]);
As well as line 99:
rank.put(aFather, quotient * rank.get(b) / rank.get(a));