根据除法表达式,返回结果。
这里将所有的除数和被除数作为图中的节点,二者的商作为边,构造有向图,考虑用DFS来对图进行遍历,如果能从A到达B,那么表示A/B是成立的,返回边上的乘积即可,主要考察coding能力。
public double[] calcEquation(List<List<String>> equations, double[] values, List<List<String>> queries) {
// 这里可以通过map来表示有向图
Map<String, Map<String, Double>> map = new HashMap<>();
double[] res = new double[queries.size()];
for (int i = 0; i < equations.size(); i++) {
// 根据equations中的式子分别求出a/b和b/a
map.putIfAbsent(equations.get(i).get(0), new HashMap<>());
map.get(equations.get(i).get(0)).put(equations.get(i).get(1), values[i]);
map.putIfAbsent(equations.get(i).get(1), new HashMap<>());
map.get(equations.get(i).get(1)).put(equations.get(i).get(0), 1.0 / values[i]);
}
for (int i = 0; i < queries.size(); i++) {
res[i] = dfs(queries.get(i).get(0), queries.get(i).get(1), map, new HashSet<>());
}
return res;
}
public double dfs(String A, String B, Map<String, Map<String, Double>> map, Set<String> set) {
if (!map.containsKey(A) || !map.containsKey(B)) {
return -1.0;
}
if (A.equals(B)) {
return 1.0;
}
Map<String, Double> pair = map.get(A);
set.add(A);
for (String index : pair.keySet()) {
// 这里的set主要是为了防止邻居节点的回边,重复访问节点
if (set.contains(index)) continue;
double res = dfs(index, B, map, set);
if (res > 0) return pair.get(index) * res;
}
return -1.0;
}