给你一个变量对数组 equations 和一个实数值数组 values 作为已知条件,其中 equations[i] = [Ai, Bi] 和 values[i] 共同表示等式 Ai / Bi = values[i] 。每个 Ai 或 Bi 是一个表示单个变量的字符串。
另有一些以数组 queries 表示的问题,其中 queries[j] = [Cj, Dj] 表示第 j 个问题,请你根据已知条件找出 Cj / Dj = ? 的结果作为答案。
返回 所有问题的答案 。如果存在某个无法确定的答案,则用 -1.0 替代这个答案。
注意:输入总是有效的。你可以假设除法运算中不会出现除数为 0 的情况,且不存在任何矛盾的结果。
示例 1:
输入:equations = [[“a”,“b”],[“b”,“c”]], values = [2.0,3.0], queries = [[“a”,“c”],[“b”,“a”],[“a”,“e”],[“a”,“a”],[“x”,“x”]]
输出:[6.00000,0.50000,-1.00000,1.00000,-1.00000]
解释:
条件:a / b = 2.0, b / c = 3.0
问题:a / c = ?, b / a = ?, a / e = ?, a / a = ?, x / x = ?
结果:[6.0, 0.5, -1.0, 1.0, -1.0 ]
代码
class Solution {
class Pair{
int index;
double val;
public Pair(int index, double val) {
this.index = index;
this.val = val;
}
}
public double[] calcEquation(List<List<String>> equations, double[] values, List<List<String>> queries) {
Map<String,Integer> map=new HashMap<>();
int cur=0;
for(int i=0;i<equations.size();i++)//记录字符串和其编号
{
if(!map.containsKey(equations.get(i).get(0)))
map.put(equations.get(i).get(0),cur++);
if(!map.containsKey(equations.get(i).get(1)))
map.put(equations.get(i).get(1),cur++);
}
List<Pair>[] lists=new List[cur];
for(int i=0;i<lists.length;i++)
{
lists[i]=new ArrayList<Pair>();
}
for(int i=0;i<equations.size();i++)//记录各个节点之间的权重
{
int va=map.get(equations.get(i).get(0)),vb=map.get(equations.get(i).get(1));
lists[va].add(new Pair(vb,values[i]));
lists[vb].add(new Pair(va,1/values[i]));
}
double[] ret=new double[queries.size()];
for(int i=0;i<queries.size();i++)
{
double res=-1;
if(map.containsKey(queries.get(i).get(0))&&map.containsKey(queries.get(i).get(1)))//出现不存在的符号返回-1
{
int ia=map.get(queries.get(i).get(0)),ib=map.get(queries.get(i).get(1));
if(ia==ib)
{
res=1;
}else{//bfs,找出去目标节点的路径
Queue<Integer> queue=new LinkedList<>();
queue.add(ia);
double[] ra=new double[cur];
Arrays.fill(ra,-1);//-1代表没到达的节点
ra[ia]=1;
while (!queue.isEmpty()&&ra[ib]<0)
{
int now=queue.poll();
for(Pair pair:lists[now])
{
int idx=pair.index;
double val=pair.val;
if(ra[idx]<0)
{
ra[idx]=val*ra[now];
queue.offer(idx);
}
}
}
res=ra[ib];
}
}
ret[i]=res;
}
return ret;
}
}