Skip to content

Commit 8beb409

Browse files
committed
[BFS] Add a solution to Evaluate Division
1 parent 7486c2b commit 8beb409

File tree

2 files changed

+77
-1
lines changed

2 files changed

+77
-1
lines changed

BFS/EvaluateDivision.swift

Lines changed: 75 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,75 @@
1+
/**
2+
* Question Link: https://leetcode.com/problems/evaluate-division/
3+
* Primary idea: Build dict to maintain divide result, and use BFS to get specific query value
4+
*
5+
* Time Complexity: O(n^2), Space Complexity: O(n)
6+
*
7+
*/
8+
9+
class EvaluateDivision {
10+
func calcEquation(_ equations: [[String]], _ values: [Double], _ queries: [[String]]) -> [Double] {
11+
let dict = initDict(equations, values)
12+
var rest = [Double]()
13+
14+
for query in queries {
15+
guard let _ = dict[query.first!], let _ = dict[query.last!] else {
16+
rest.append(-1.0)
17+
continue
18+
}
19+
20+
bfs(query, dict, &rest)
21+
}
22+
23+
return rest
24+
}
25+
26+
fileprivate func initDict(_ equations: [[String]], _ values: [Double]) -> [String: [(String, Double)]] {
27+
var dict = [String: [(String, Double)]]()
28+
29+
for (i, equation) in equations.enumerated() {
30+
let dividend = equation.first!, divisor = equation.last!, divideRes = values[i]
31+
32+
insert(dividend, divisor, divideRes, to: &dict)
33+
insert(divisor, dividend, 1.0 / divideRes, to: &dict)
34+
}
35+
36+
return dict
37+
}
38+
39+
fileprivate func insert(_ dividend: String, _ divisor: String, _ divideRes: Double, to dict: inout [String: [(String, Double)]]) {
40+
if dict[dividend] == nil {
41+
dict[dividend] = [(divisor, divideRes)]
42+
} else {
43+
dict[dividend]!.append((divisor, divideRes))
44+
}
45+
}
46+
47+
fileprivate func bfs(_ query: [String], _ dict: [String: [(String, Double)]], _ rest: inout [Double]) {
48+
var visited = Set([query.first!])
49+
var qStrs = [query.first!]
50+
var qVals = [1.0]
51+
52+
while !qStrs.isEmpty {
53+
let currentStr = qStrs.removeFirst()
54+
let currentVal = qVals.removeFirst()
55+
56+
if currentStr == query.last! {
57+
rest.append(currentVal)
58+
return
59+
}
60+
61+
for (str, val) in dict[currentStr]! {
62+
guard !visited.contains(str) else {
63+
continue
64+
}
65+
66+
visited.insert(str)
67+
qStrs.append(str)
68+
qVals.append(currentVal * val)
69+
}
70+
71+
72+
rest.append(-1.0)
73+
}
74+
}
75+
}

README.md

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -28,7 +28,7 @@
2828
* [Microsoft](#microsoft)
2929

3030
## Progress
31-
[Problem Status](#problem-status) shows the latest progress to all 800+ questions. Currently we have 247 completed solutions. Note: questions with ♥ mark means that you have to **Subscript to premium membership** of LeetCode to unlock them. Thank you for great contributions from [CharleneJiang](https://github.com/CharleneJiang), [ReadmeCritic](https://github.com/ReadmeCritic), [demonkoo](https://github.com/demonkoo), [DaiYue](https://github.com/DaiYue), [Quaggie](https://github.com/Quaggie) and [jindulys](https://github.com/jindulys).
31+
[Problem Status](#problem-status) shows the latest progress to all 800+ questions. Currently we have 248 completed solutions. Note: questions with ♥ mark means that you have to **Subscript to premium membership** of LeetCode to unlock them. Thank you for great contributions from [CharleneJiang](https://github.com/CharleneJiang), [ReadmeCritic](https://github.com/ReadmeCritic), [demonkoo](https://github.com/demonkoo), [DaiYue](https://github.com/DaiYue), [Quaggie](https://github.com/Quaggie) and [jindulys](https://github.com/jindulys).
3232

3333

3434
## Array
@@ -241,6 +241,7 @@
241241
## Breadth-first search
242242
| Title | Solution | Difficulty | Time | Space |
243243
| ----- | -------- | ---------- | ---- | ----- |
244+
[Evaluate Division](https://leetcode.com/problems/evaluate-division/)| [Swift](./BFS/EvaluateDivision.swift)| Medium| O(n^2)| O(n)|
244245
[Shortest Distance from All Buildings](https://leetcode.com/problems/shortest-distance-from-all-buildings/)| [Swift](./BFS/ShortestDistanceAllBuildings.swift)| Hard| O((mn)^2)| O(mn)|
245246

246247
## Math

0 commit comments

Comments
 (0)