File tree Expand file tree Collapse file tree 1 file changed +53
-0
lines changed Expand file tree Collapse file tree 1 file changed +53
-0
lines changed Original file line number Diff line number Diff line change 1+ /**
2+ * Question Link: https://leetcode.com/problems/race-car/
3+ * Primary idea: BFS to go over A or R at a specific step. Only add R to the queue when necessary.
4+ *
5+ * Time Complexity: O(nlogn), Space Complexity: O(n)
6+ */
7+
8+ class RaceCar {
9+ func racecar( _ target: Int ) -> Int {
10+ let startNode = Node ( speed: 1 , position: 0 )
11+ var queue = [ startNode] , len = 0 , isVisited = Set < Node > ( )
12+
13+ while !queue. isEmpty {
14+ let size = queue. count
15+
16+ for _ in 0 ..< size {
17+ let node = queue. removeFirst ( )
18+
19+ if node. position == target {
20+ return len
21+ }
22+
23+ if isVisited. contains ( node) {
24+ continue
25+ }
26+
27+ isVisited. insert ( node)
28+
29+ let ANode = Node ( speed: node. speed * 2 , position: node. position + node. speed)
30+ queue. append ( ANode)
31+
32+ if shouldRevert ( node, target) {
33+ let RNode = Node ( speed: node. speed > 0 ? - 1 : 1 , position: node. position)
34+ queue. append ( RNode)
35+ }
36+
37+ }
38+
39+ len += 1
40+ }
41+
42+ return len
43+ }
44+
45+ private func shouldRevert( _ node: Node , _ target: Int ) -> Bool {
46+ return ( node. position + node. speed > target && node. speed > 0 ) || ( node. position + node. speed < target && node. speed < 0 )
47+ }
48+
49+ struct Node : Hashable {
50+ let speed : Int
51+ let position : Int
52+ }
53+ }
You can’t perform that action at this time.
0 commit comments