• 博客园logo
  • 会员
  • 众包
  • 新闻
  • 博问
  • 闪存
  • 赞助商
  • HarmonyOS
  • Chat2DB
    • 搜索
      所有博客
    • 搜索
      当前博客
  • 写随笔 我的博客 短消息 简洁模式
    用户头像
    我的博客 我的园子 账号设置 会员中心 简洁模式 ... 退出登录
    注册 登录
neverlandly
博客园    首页    新随笔    联系   管理    订阅  订阅

Leetcode: 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.

Graph, DFS

(1) Build the map, the key is dividend, the value is also a map whose key is divisor and value is its parameter. For example, a / b = 2.0, the map entry is <"a", <"b", 2.0>>. To make searching and calculation easier, we also put b / a = 0.5 into the map.
(2) for each query, use DFS to search divisors recursively

 1 public class Solution {
 2     public double[] calcEquation(String[][] equations, double[] values, String[][] queries) {
 3         double[] res = new double[queries.length];
 4         HashMap<String, HashMap<String, Double>> map = new HashMap<String, HashMap<String, Double>>();
 5         for (int i=0; i<equations.length; i++) {
 6             String[] equation = equations[i];
 7             double value = values[i];
 8             if (!map.containsKey(equation[0])) {
 9                 map.put(equation[0], new HashMap<String, Double>());
10                 map.get(equation[0]).put(equation[0], 1.0);
11             }
12             if (!map.containsKey(equation[1])) {
13                 map.put(equation[1], new HashMap<String, Double>());
14                 map.get(equation[1]).put(equation[1], 1.0);
15             }
16             map.get(equation[0]).put(equation[1], value);
17             map.get(equation[1]).put(equation[0], 1/value);
18         }
19 
20         for (int j=0; j<queries.length; j++) {
21             res[j] = -1.0; //initialize
22             dfs(map, queries[j][0], queries[j][1], new HashSet<String>(), res, j, 1.0);
23         }
24         return res;
25     }
26     
27     public void dfs(HashMap<String, HashMap<String, Double>> map, String src, String dest, HashSet<String> visited, double[] res, int index, double pathVal) {
28         if (!map.containsKey(src) || !map.containsKey(dest)) {
29             res[index] = -1.0;
30             return;
31         }
32         if (visited.contains(src)) return;
33         HashMap<String, Double> srcNb = map.get(src);
34         if (srcNb.containsKey(dest)) {
35             res[index] = pathVal * srcNb.get(dest);
36             return;
37         }
38         visited.add(src);
39         for (Map.Entry<String, Double> entry : srcNb.entrySet()) {
40             String neibor = entry.getKey();
41             dfs(map, neibor, dest, visited, res, index, pathVal*entry.getValue());
42         }
43         visited.remove(src);
44     }
45 }

 

posted @ 2016-12-02 02:10  neverlandly  阅读(327)  评论(0)    收藏  举报
刷新页面返回顶部
博客园  ©  2004-2025
浙公网安备 33010602011771号 浙ICP备2021040463号-3