-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy path0399-evaluate-division.js
More file actions
99 lines (83 loc) · 2.53 KB
/
0399-evaluate-division.js
File metadata and controls
99 lines (83 loc) · 2.53 KB
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
/**
* Evaluate Division
* Time Complexity: O((V + E) * Q)
* Space Complexity: O(V + E)
*/
var calcEquation = function (equations, values, queries) {
const adjacencyGraph = new Map();
let equationIdx = 0;
const equationsTotal = equations.length;
while (equationIdx < equationsTotal) {
const currentEq = equations[equationIdx];
const varAlpha = currentEq[0];
const varBeta = currentEq[1];
const currentVal = values[equationIdx];
let neighborsAlpha = adjacencyGraph.get(varAlpha);
if (neighborsAlpha === undefined) {
neighborsAlpha = [];
}
neighborsAlpha.push([varBeta, currentVal]);
adjacencyGraph.set(varAlpha, neighborsAlpha);
let neighborsBeta = adjacencyGraph.get(varBeta);
if (neighborsBeta === undefined) {
neighborsBeta = [];
}
neighborsBeta.push([varAlpha, 1 / currentVal]);
adjacencyGraph.set(varBeta, neighborsBeta);
equationIdx++;
}
function depthFirstSearch(
sourceVar,
targetVar,
visitedNodesSet,
currentProduct,
) {
if (!adjacencyGraph.has(sourceVar) || !adjacencyGraph.has(targetVar)) {
return -1.0;
}
if (sourceVar === targetVar) {
return currentProduct;
}
visitedNodesSet.add(sourceVar);
const sourceConnections = adjacencyGraph.get(sourceVar);
let connectionCount = 0;
const totalSourceConnections = sourceConnections.length;
while (connectionCount < totalSourceConnections) {
const connectionDetailsArray = sourceConnections[connectionCount];
const nextNodeVar = connectionDetailsArray[0];
const edgeWeightVal = connectionDetailsArray[1];
if (!visitedNodesSet.has(nextNodeVar)) {
const pathResultFromNext = depthFirstSearch(
nextNodeVar,
targetVar,
visitedNodesSet,
currentProduct * edgeWeightVal,
);
if (pathResultFromNext !== -1.0) {
return pathResultFromNext;
}
}
connectionCount++;
}
return -1.0;
}
const finalResults = [];
let queryIteration = 0;
const queriesTotal = queries.length;
while (queryIteration < queriesTotal) {
const currentQuery = queries[queryIteration];
const querySrc = currentQuery[0];
const queryDest = currentQuery[1];
const queryVisitedTracker = new Set();
const initialQueryProduct = 1.0;
const resultForQuery = depthFirstSearch(
querySrc,
queryDest,
queryVisitedTracker,
initialQueryProduct,
);
finalResults.push(resultForQuery);
queryIteration++;
}
return finalResults;
};