-
Notifications
You must be signed in to change notification settings - Fork 2
/
EvaluateDivision.java
133 lines (113 loc) · 4.41 KB
/
EvaluateDivision.java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
package Leetcode;
import java.util.*;
/**
* @author kalpak
*
* You are given an array of variable pairs equations and an array of real numbers values,
* where equations[i] = [Ai, Bi] and values[i] represent the equation Ai / Bi = values[i].
*
* Each Ai or Bi is a string that represents a single variable.
*
* You are also given some queries,
* where queries[j] = [Cj, Dj] represents the jth query where you must find the answer for Cj / Dj = ?.
*
* Return the answers to all queries. If a single answer cannot be determined, return -1.0.
*
* Note: The input is always valid.
* You may assume that evaluating the queries will not result in division by zero and that there is no contradiction.
*
*
*
* Example 1:
* Input: equations = [["a","b"],["b","c"]], values = [2.0,3.0], queries = [["a","c"],["b","a"],["a","e"],["a","a"],["x","x"]]
* Output: [6.00000,0.50000,-1.00000,1.00000,-1.00000]
* Explanation:
* 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 ]
*
*
* Example 2:
* Input: equations = [["a","b"],["b","c"],["bc","cd"]], values = [1.5,2.5,5.0], queries = [["a","c"],["c","b"],["bc","cd"],["cd","bc"]]
* Output: [3.75000,0.40000,5.00000,0.20000]
*
*
* Example 3:
* Input: equations = [["a","b"]], values = [0.5], queries = [["a","b"],["b","a"],["a","c"],["x","y"]]
* Output: [0.50000,2.00000,-1.00000,-1.00000]
*
*
* Constraints:
*
* 1 <= equations.length <= 20
* equations[i].length == 2
* 1 <= Ai.length, Bi.length <= 5
* values.length == equations.length
* 0.0 < values[i] <= 20.0
* 1 <= queries.length <= 20
* queries[i].length == 2
* 1 <= Cj.length, Dj.length <= 5
* Ai, Bi, Cj, Dj consist of lower case English letters and digits.
*/
public class EvaluateDivision {
static class Node {
String key;
double value;
public Node(String key, double value) {
this.key = key;
this.value = value;
}
}
public static double[] calcEquation(List<List<String>> equations, double[] values, List<List<String>> queries) {
Map<String, List<Node>> graph = new HashMap<>();
double[] result = new double[queries.size()];
buildGraph(graph, equations, values);
for(int i = 0; i < queries.size(); i++) {
result[i] = queryDFS(graph, queries.get(i).get(0), queries.get(i).get(1), new HashSet<>());
}
return result;
}
private static double queryDFS(Map<String, List<Node>> graph, String source, String destination, Set<String> isVisited) {
// Check if either source or destination is present in the graph or not.
// If not, return 0;
if(!graph.containsKey(source) || !graph.containsKey(destination))
return -1.0;
// Check if source is equal to destination.
// Return 1.0
if(source.equals(destination))
return 1.0;
// Mark source as visited
isVisited.add(source);
for(Node node : graph.get(source)) {
if(!isVisited.contains(node.key)) {
double answer = queryDFS(graph, node.key, destination, isVisited);
if(answer != -1.0)
return answer*node.value;
}
}
return -1.0;
}
private static void buildGraph(Map<String, List<Node>> graph, List<List<String>> equations, double[] values) {
for(int i = 0; i < values.length; i++) {
String from = equations.get(i).get(0);
String to = equations.get(i).get(1);
graph.putIfAbsent(from, new ArrayList<>());
graph.putIfAbsent(to, new ArrayList<>());
graph.get(from).add(new Node(to, values[i]));
graph.get(to).add(new Node(from, 1/values[i])); // Reciprocal for the reverse direction
}
}
public static void main(String[] args) {
String[][] eq = new String[][]{{"a","b"},{"b","c"}};
double[] values = new double[]{2.0, 3.0};
String[][] qr = new String[][]{{"a","c"},{"b","a"},{"a","e"},{"a","a"},{"x","x"}};
List<List<String>> equations = new ArrayList<>();
for(String[] equation : eq)
equations.add(Arrays.asList(equation));
List<List<String>> queries = new ArrayList<>();
for(String[] q : qr) {
queries.add(Arrays.asList(q));
}
System.out.println(Arrays.toString(calcEquation(equations, values, queries)));
}
}