您的位置:首页 > 编程语言 > Lua

399. Evaluate Division

2017-01-14 15:42 232 查看
结题思路是:

a/b=v

可以看成是一个又a点指向b点的有向图 边的权值为v

有了a指向b的边 就有 b指向a的边 大小为1/v

则求 c/v 的话就是在图中寻找一条由c指向v的边 将边上所有的权值相乘即可。

public class Solution {
public double[] calcEquation(String[][] equations, double[] values, String[][] queries) {
HashMap<String,ArrayList<String>> pairs=new HashMap<String,ArrayList<String>>();
HashMap<String,ArrayList<Double>> valuepairs=new HashMap<String,ArrayList<Double>>();
for(int i=0;i<equations.length;i++){
String[] equation = equations[i];
if(!pairs.containsKey(equation[0])){
pairs.put(equation[0], new ArrayList<String>());
}
if(!pairs.containsKey(equation[1])){
pairs.put(equation[1], new ArrayList<String>());
}
if(!valuepairs.containsKey(equation[0])){
valuepairs.put(equation[0],new ArrayList<Double>());
}
if(!valuepairs.containsKey(equation[1])){
valuepairs.put(equation[1], new ArrayList<Double>());
}
pairs.get(equation[0]).add(equation[1]);
pairs.get(equation[1]).add(equation[0]);
valuepairs.get(equation[0]).add(values[i]);
valuepairs.get(equation[1]).add(1/values[i]);
}
double[] result=new double[queries.length];
for(int i=0;i<queries.length;i++)
{
double temp=DFS(queries[i][0],queries[i][1],pairs,valuepairs,new HashSet<String>(),1.0);
if(temp==0.0)
result[i]=-1.0;
else
result[i]=temp;
}
return result;
}
private double DFS(String start,String end,HashMap<String,ArrayList<String>> pairs,HashMap<String,ArrayList<Double>> valuepairs,HashSet<String> s,double value){
if(s.contains(start)) return 0.0;
if(!pairs.containsKey(start)) return 0.0;
if(start.equals(end)) return value;
s.add(start);
ArrayList<String> pair=pairs.get(start);
ArrayList<Double> valuepair=valuepairs.get(start);
double temp=0.0;
for(int i=0;i<pair.size();i++){
temp=DFS(pair.get(i),end,pairs,valuepairs,s,value*valuepair.get(i));
if(temp!=0.0)
break;
}
s.remove(start);
return temp;
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: