399. Evaluate Division

来源:互联网 发布:何炅情商知乎 编辑:程序博客网 时间:2024/06/01 08:49

结题思路是:
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;    }}
1 0
原创粉丝点击