class Solution {
public double[] calcEquation(List<List<String>> equations, double[] values, List<List<String>> queries) {
//这一题可以将我们的除法计算过程抽象成一个图来做运算,每一个除数与被除数抽象成图的一个节点,而除数和被除数的关系抽象成图的边,至于商则是除数上的一个属性,我们运用宇哥Map<String,Map<String,Double>>这样一个结构来存储每一个节点第一个key代表着被除数,第二个key代表除数,Double则代表着这个除法关系的商
//首先我们需要将equation和values转化成一张使用如上关系表示的图结构
Map<String,Map<String,Double>> graph = createGraph(equations,values);
double[] result = new double[queries.size()];
//对于每一个需要计算的queries表示的是图结构上一条路劲的乘积,所以我们遍历queries计算对图进行一个深度优先搜索计算出结果
for(int i = 0;i < queries.size();i++){
String from = queries.get(i).get(0);
String to = queries.get(i).get(1);
if(!graph.containsKey(from) || !graph.containsKey(to)){
result[i] = -1.0;
}else{
Set<String> visited = new HashSet<>();
result[i] = dfs(graph,from,to,visited);
}
}
return result;
}
//构建图
private Map<String,Map<String,Double>> createGraph(List<List<String>> equations, double[] values){
Map<String,Map<String,Double>> graph = new HashMap<>();
//遍历equtions对其中的每一个除法关系构建一个节点,并且创建节点的关系,相应的需要构建一条被除数到除数的除法关系的边
for(int i = 0;i < equations.size();i++){
String var1 = equations.get(i).get(0);
String var2 = equations.get(i).get(1);
//首先构建var1节点,并创建var1上的边
graph.putIfAbsent(var1,new HashMap<String,Double>());
graph.get(var1).put(var2,values[i]);
//构建var2节点,并创建var2节点上面的边
graph.putIfAbsent(var2,new HashMap<String,Double>());
graph.get(var2).put(var1,1.0/values[i]);
}
return graph;
}
private Double dfs(Map<String,Map<String,Double>> graph,String from,String to,Set<String> visited){
//如果from == to说明找到我们要寻找的节点
if(from.equals(to)){
return 1.0;
}
//表示访问过from了
visited.add(from);
//遍历from的每一个节点深度优先搜索
for(Map.Entry<String,Double> entry : graph.get(from).entrySet()){
String next = entry.getKey();
if(!visited.contains(next)){
double nextValue = dfs(graph,next,to,visited);
if(nextValue > 0){
return entry.getValue() * nextValue;
}
}
}
visited.remove(from);
//如果所有的节点都遍历结束了还没有找到说明本路径不存在我们要寻找的to节点返回一个负数作为标识
return -1.0;
}
}
计算除法java实现
最新推荐文章于 2024-04-04 13:58:26 发布