LeetCode 399. Evaluate Division

Posted Dylan_Java_NYC

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了LeetCode 399. Evaluate Division相关的知识,希望对你有一定的参考价值。

原题链接在这里:https://leetcode.com/problems/evaluate-division/description/

题目:

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, 和graph中的edge的weight.

在求新的query时做dfs. 求结果.

Time Complexity: O(queries.length*(V+E)). dfs 用时O(V+E). E = equations.length. V = graph.size().

Space: O(V). regardless res.

AC Java:

 1 class Solution {
 2     public double[] calcEquation(String[][] equations, double[] values, String[][] queries) {
 3         HashMap<String, List<String>> graph = new HashMap<String, List<String>>();
 4         HashMap<String, List<Double>> weight = new HashMap<String, List<Double>>();
 5         for(int i = 0; i<equations.length; i++){
 6             String [] equation = equations[i];
 7             if(!graph.containsKey(equation[0])){
 8                 graph.put(equation[0], new ArrayList<String>());
 9                 weight.put(equation[0], new ArrayList<Double>());
10             }
11             graph.get(equation[0]).add(equation[1]);
12             weight.get(equation[0]).add(values[i]);
13             
14             if(values[i] == 0.0){
15                 continue;
16             }
17             
18             if(!graph.containsKey(equation[1])){
19                 graph.put(equation[1], new ArrayList<String>());
20                 weight.put(equation[1], new ArrayList<Double>());
21             }
22             graph.get(equation[1]).add(equation[0]);
23             weight.get(equation[1]).add(1.0/values[i]);
24         }
25         
26         double [] res = new double[queries.length];
27         for(int i = 0; i<queries.length; i++){
28             String [] query = queries[i];
29             res[i] = dfs(query[0], query[1], graph, weight, new HashSet<String>(), 1.0);
30             if(res[i] == 0.0){
31                 res[i] = -1.0;
32             }
33         }
34         
35         return res;
36     }
37     
38     private double dfs(String start, String end, Map<String, List<String>> graph, Map<String, List<Double>> weight, Set<String> visited, double cur){
39         if(visited.contains(start) || !graph.containsKey(start)){
40             return 0.0;
41         }
42         
43         if(start.equals(end)){
44             return cur;
45         }
46         
47         double res = 0.0;
48         visited.add(start);
49         for(int i = 0; i<graph.get(start).size(); i++){
50             res = dfs(graph.get(start).get(i), end, graph, weight, visited, cur*weight.get(start).get(i));
51             if(res != 0.0){
52                 break;
53             }
54         }
55         visited.remove(start);
56         return res;
57     }
58 }

 




以上是关于LeetCode 399. Evaluate Division的主要内容,如果未能解决你的问题,请参考以下文章

leetcode [399]Evaluate Division

[LeetCode] 399. Evaluate Division Java

[leetcode]Graph-399. Evaluate Division

[LeetCode] 399. Evaluate Division 求除法表达式的值

399. Evaluate Division

399. Evaluate Division