forked from black-shadows/LeetCode-Topicwise-Solutions
-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathfrog-position-after-t-seconds.py
131 lines (118 loc) · 3.74 KB
/
frog-position-after-t-seconds.py
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
# Time: O(n)
# Space: O(n)
import collections
# bfs solution with better precision
class Solution(object):
def frogPosition(self, n, edges, t, target):
"""
:type n: int
:type edges: List[List[int]]
:type t: int
:type target: int
:rtype: float
"""
G = collections.defaultdict(list)
for u, v in edges:
G[u].append(v)
G[v].append(u)
stk = [(t, 1, 0, 1)]
while stk:
new_stk = []
while stk:
t, node, parent, choices = stk.pop()
if not t or not (len(G[node])-(parent != 0)):
if node == target:
return 1.0/choices
continue
for child in G[node]:
if child == parent:
continue
new_stk.append((t-1, child, node,
choices*(len(G[node])-(parent != 0))))
stk = new_stk
return 0.0
# Time: O(n)
# Space: O(n)
# dfs solution with stack with better precision
class Solution2(object):
def frogPosition(self, n, edges, t, target):
"""
:type n: int
:type edges: List[List[int]]
:type t: int
:type target: int
:rtype: float
"""
G = collections.defaultdict(list)
for u, v in edges:
G[u].append(v)
G[v].append(u)
stk = [(t, 1, 0, 1)]
while stk:
t, node, parent, choices = stk.pop()
if not t or not (len(G[node])-(parent != 0)):
if node == target:
return 1.0/choices
continue
for child in G[node]:
if child == parent:
continue
stk.append((t-1, child, node,
choices*(len(G[node])-(parent != 0))))
return 0.0
# Time: O(n)
# Space: O(n)
# dfs solution with recursion with better precision
class Solution3(object):
def frogPosition(self, n, edges, t, target):
"""
:type n: int
:type edges: List[List[int]]
:type t: int
:type target: int
:rtype: float
"""
def dfs(G, target, t, node, parent):
if not t or not (len(G[node])-(parent != 0)):
return int(node == target)
result = 0
for child in G[node]:
if child == parent:
continue
result = dfs(G, target, t-1, child, node)
if result:
break
return result*(len(G[node])-(parent != 0))
G = collections.defaultdict(list)
for u, v in edges:
G[u].append(v)
G[v].append(u)
choices = dfs(G, target, t, 1, 0)
return 1.0/choices if choices else 0.0
# Time: O(n)
# Space: O(n)
# dfs solution with recursion
class Solution4(object):
def frogPosition(self, n, edges, t, target):
"""
:type n: int
:type edges: List[List[int]]
:type t: int
:type target: int
:rtype: float
"""
def dfs(G, target, t, node, parent):
if not t or not (len(G[node])-(parent != 0)):
return float(node == target)
for child in G[node]:
if child == parent:
continue
result = dfs(G, target, t-1, child, node)
if result:
break
return result/(len(G[node])-(parent != 0))
G = collections.defaultdict(list)
for u, v in edges:
G[u].append(v)
G[v].append(u)
return dfs(G, target, t, 1, 0)