leetcode 399. Evaluate Division
题目:
Equations are given in the format A / B = k
, where A
and B
are variables represented as strings, and k
is a real number (floating point number). Given some queries, return the answers. If the answer does not exist, return -1.0
.
Example:
Given a / b = 2.0, b / c = 3.0.
queries are: a / c = ?, b / a = ?, a / e = ?, a / a = ?, x / x = ? .
return [6.0, 0.5, -1.0, 1.0, -1.0 ].
The input is: vector<pair<string, string>> equations, vector<double>& values, vector<pair<string, string>> queries
, where equations.size() == values.size()
, and the values are positive. This represents the equations. Return vector<double>
.
According to the example above:
equations = [ ["a", "b"], ["b", "c"] ], values = [2.0, 3.0], queries = [ ["a", "c"], ["b", "a"], ["a", "e"], ["a", "a"], ["x", "x"] ].
The input is always valid. You may assume that evaluating the queries will result in no division by zero and there is no contradiction.
1 import java.util.*; 2 3 public class Solution { 4 public double[] calcEquation(String[][] equations, double[] values, String[][] queries) { 5 Map<String,Map<String,Double>> eqmap = new HashMap<String, Map<String, Double>>(); 6 double[] result = new double[queries.length]; 7 for(int i=0;i<equations.length;i++){ 8 Map<String,Double> temp = new HashMap<String, Double>(); 9 if(eqmap.containsKey(equations[i][0])) 10 eqmap.get(equations[i][0]).put(equations[i][1],values[i]); 11 else{ 12 temp.put(equations[i][1],values[i]); 13 eqmap.put(equations[i][0],temp); 14 } 15 if(eqmap.containsKey(equations[i][1])) 16 eqmap.get(equations[i][1]).put(equations[i][0],1/values[i]); 17 else{ 18 temp = new HashMap<String, Double>(); 19 temp.put(equations[i][0],1/values[i]); 20 eqmap.put(equations[i][1],temp); 21 } 22 } 23 for(int j=0;j<queries.length;j++){ 24 Stack<String> strK = new Stack<String>(); 25 Set<String> strS = new HashSet<String>(); 26 result[j] = getResult(eqmap,queries[j],strK,strS); 27 } 28 return result; 29 } 30 private double getResult(Map<String,Map<String,Double>> eqmap, String[] query, Stack<String> strK,Set<String> strS){ 31 if(eqmap.containsKey(query[0])&&eqmap.containsKey(query[1])){ 32 Map<String, Double> tempmap = eqmap.get(query[0]); 33 if (tempmap.containsKey(query[1])) { 34 return tempmap.get(query[1]); 35 } 36 else{ 37 Iterator ite = eqmap.get(query[0]).entrySet().iterator(); 38 while(ite.hasNext()){ 39 Map.Entry ent = (Map.Entry)ite.next(); 40 if(!strS.add((String)ent.getKey())) 41 continue; 42 strK.push(query[0]); 43 double result = (Double) ent.getValue() * getResult(eqmap,new String[]{(String) ent.getKey(),query[1]},strK,strS); 44 if(result>0) 45 return result; 46 else strK.pop(); 47 } 48 } 49 } 50 return -1.0; 51 } 52 }