给你一个变量对数组 equations 和一个实数值数组 values 作为已知条件,其中 equations[i] = [Ai, Bi] 和 values[i] 共同表示等式 Ai / Bi = values[i] 。每个 Ai 或 Bi 是一个表示单个变量的字符串。
另有一些以数组 queries 表示的问题,其中 queries[j] = [Cj, Dj] 表示第 j 个问题,请你根据已知条件找出 Cj / Dj = ? 的结果作为答案。
返回 所有问题的答案 。如果存在某个无法确定的答案,则用 -1.0 替代这个答案。如果问题中出现了给定的已知条件中没有出现的字符串,也需要用 -1.0 替代这个答案。
注意:输入总是有效的。你可以假设除法运算中不会出现除数为 0 的情况,且不存在任何矛盾的结果。
JAVA:
class Cell{
String str;//分母
double div;//A/B的结果
Cell(String str,double div){
this.str=str;
this.div=div;
}
}
class Solution {
public double[] calcEquation(List<List<String>> equations, double[] values, List<List<String>> queries) {
//构建图
Map<String,List<Cell>> graph=new HashMap<>();
for(int i=0;i<values.length;i++){
String s1=equations.get(i).get(0),s2=equations.get(i).get(1);//0是分子,1是分母
graph.computeIfAbsent(s1,k->new ArrayList()).add(new Cell(s2,values[i]));
graph.computeIfAbsent(s2,k->new ArrayList()).add(new Cell(s1,1.0/values[i]));
}
//dfs前的准备
double[] res=new double[queries.size()];
Arrays.fill(res,-1.0);
for(int i=0;i<queries.size();i++){
dfs(queries.get(i).get(0),queries.get(i).get(1),1.0,graph,res,i,new HashSet<>());
}
return res;
}
public void dfs(String src,String dst,double cur,Map<String,List<Cell>> graph,double[] res,int index,Set<String> visited){
if(!visited.add(src)){
return;
}
if(src.equals(dst)&&graph.containsKey(src)){
res[index]=cur;
return;
}
for(Cell nei:graph.getOrDefault(src,new ArrayList<>())){
dfs(nei.str,dst,cur*nei.div,graph,res,index,visited);
}
}
}