-
Notifications
You must be signed in to change notification settings - Fork 4
/
tournament-winner.py
93 lines (84 loc) · 2.77 KB
/
tournament-winner.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
# Tournament Winner
# 🟢 Easy
#
# https://www.algoexpert.io/questions/tournament-winner
#
# Tags: Array
import timeit
from collections import Counter
# The cleanest solution uses collections.Counter. I tried to shorten it
# using list comprehension but could not see how to do it.
#
# Time complexity: O(m) - With m the number of competitions, we visit
# each competition and result on the input once.
# Space complexity: O(n) - With n the number of teams, we will store
# one entry on the counter for each team.
class Solution:
def tournamentWinner(self, competitions, results):
c = Counter()
for i in range(len(competitions)):
# Since points are either 3 or 0, using 3 or 1 does not
# change anything.
c[competitions[i][results[i] - 1]] += 1
return c.most_common()[0][0]
# The cleanest solution uses collections.Counter. I tried to shorten it
# using list comprehension but could not see how to do it.
#
# Time complexity: O(m) - With m the number of competitions, we visit
# each competition and result on the input once.
# Space complexity: O(n) - With n the number of teams, we will store
# one entry on the counter for each team.
class Solution2:
def tournamentWinner(self, competitions, results):
c = {}
winner = (None, 0)
for i in range(len(competitions)):
team = competitions[i][results[i] - 1]
if team not in c:
c[team] = 1
else:
c[team] += 1
if c[team] > winner[1]:
winner = (team, c[team])
return winner[0]
def test():
executors = [
Solution,
Solution2,
]
tests = [
[
[["HTML", "C#"], ["C#", "Python"], ["Python", "HTML"]],
[0, 0, 1],
"Python",
],
[
[
["HTML", "Java"],
["Java", "Python"],
["Python", "HTML"],
["C#", "Python"],
["Java", "C#"],
["C#", "HTML"],
],
[0, 1, 1, 1, 0, 1],
"C#",
],
]
for executor in executors:
start = timeit.default_timer()
for _ in range(1):
for col, t in enumerate(tests):
sol = executor()
result = sol.tournamentWinner(t[0], t[1])
exp = t[2]
assert result == exp, (
f"\033[93m» {result} <> {exp}\033[91m for"
+ f" test {col} using \033[1m{executor.__name__}"
)
stop = timeit.default_timer()
used = str(round(stop - start, 5))
cols = "{0:20}{1:10}{2:10}"
res = cols.format(executor.__name__, used, "seconds")
print(f"\033[92m» {res}\033[0m")
test()