Skip to content

Commit bc7d2ef

Browse files
added few leetcode solutions
1 parent f9a19d9 commit bc7d2ef

File tree

6 files changed

+207
-1
lines changed

6 files changed

+207
-1
lines changed
Lines changed: 34 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,34 @@
1+
from typing import List
2+
3+
4+
class Solution:
5+
def countHighestScoreNodes(self, parents: List[int]) -> int:
6+
from collections import defaultdict, Counter
7+
graph = defaultdict(list)
8+
for _node, parent in enumerate(parents):
9+
graph[parent].append(_node)
10+
# print(graph)
11+
counter = Counter()
12+
n = len(parents)
13+
14+
def count_nodes(node):
15+
score = 1
16+
children = 0
17+
for child in graph[node]:
18+
t = count_nodes(child)
19+
t += 1
20+
children += t
21+
score = score * t
22+
upward_nodes = n - 1 - children
23+
# print(locals())
24+
if upward_nodes:
25+
score = score * upward_nodes
26+
counter[score] += 1
27+
return children
28+
29+
count_nodes(0)
30+
return counter[max(counter.keys())]
31+
32+
33+
if __name__ == '__main__':
34+
print(Solution().countHighestScoreNodes([-1, 2, 0, 2, 0]))

Leetcode/Jul2021/dequesTut.py

Lines changed: 31 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,31 @@
1+
# time_append.py
2+
3+
from collections import deque
4+
from time import perf_counter
5+
6+
TIMES = 10_000
7+
a_list = []
8+
a_deque = deque()
9+
10+
11+
def average_time(func, times):
12+
total = 0.0
13+
for i in range(times):
14+
start = perf_counter()
15+
func(i)
16+
total += (perf_counter() - start) * 1e9
17+
return total / times
18+
19+
20+
a_list = [TIMES] * TIMES
21+
for _ in range(TIMES):
22+
a_deque.append(TIMES)
23+
24+
print(f'len() : {len(a_list)}')
25+
list_time = average_time(lambda i: a_list.pop(0), TIMES)
26+
deque_time = average_time(lambda i: a_deque.popleft(), TIMES)
27+
print(f'len() : {len(a_list)}')
28+
gain = list_time / deque_time
29+
30+
print(f"list.insert() {list_time:.6} ns")
31+
print(f"deque.appendleft() {deque_time:.6} ns ({gain:.6}x faster)")
Lines changed: 43 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,43 @@
1+
# https://leetcode.com/problems/parallel-courses-iii/
2+
3+
from collections import deque
4+
from collections import defaultdict
5+
from typing import List
6+
7+
8+
class Solution:
9+
def minimumTime(self, n: int, relations: List[List[int]], time: List[int]) -> int:
10+
11+
edges = defaultdict(list)
12+
indegrees = [0] * n
13+
for relation in relations:
14+
edges[relation[0] - 1].append(relation[1] - 1)
15+
indegrees[relation[1] - 1] += 1
16+
17+
# Initializing a queue
18+
q = deque()
19+
for indx, indegree in enumerate(indegrees):
20+
if indegree == 0:
21+
q.append(indx)
22+
else:
23+
pass
24+
25+
distance = [0] * n
26+
# print(q, time, edges, indegrees)
27+
while q:
28+
# print(q, time, edges, indegrees, distance)
29+
node = q.popleft()
30+
node_dist = max(distance[node], time[node])
31+
distance[node] = node_dist
32+
if node in edges:
33+
for neigbour in edges[node]:
34+
indegrees[neigbour] -= 1
35+
distance[neigbour] = max(distance[node] + time[neigbour], distance[neigbour])
36+
if indegrees[neigbour] == 0:
37+
q.append(neigbour)
38+
39+
return max(distance)
40+
41+
42+
print(Solution().minimumTime(n=5, relations=[[1, 5], [2, 5], [3, 5], [3, 4], [4, 5]], time=[1, 2, 3, 4, 5]))
43+
# print(Solution().minimumTime(n=3, relations=[[1, 3], [2, 3]], time=[3, 2, 5]))

Leetcode/Jul2021/zigzag-conversion.py

Lines changed: 67 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,67 @@
1+
# https://leetcode.com/problems/zigzag-conversion/
2+
# The string "PAYPALISHIRING" is written in a zigzag pattern on a given number of rows like this:
3+
# (you may want to display this pattern in a fixed font for better legibility)
4+
#
5+
# P A H N
6+
# A P L S I I G
7+
# Y I R
8+
# And then read line by line: "PAHNAPLSIIGYIR"
9+
#
10+
# Write the code that will take a string and make this conversion given a number of rows:
11+
#
12+
# string convert(string s, int numRows);
13+
#
14+
#
15+
# Example 1:
16+
#
17+
# Input: s = "PAYPALISHIRING", numRows = 3
18+
# Output: "PAHNAPLSIIGYIR"
19+
# Example 2:
20+
#
21+
# Input: s = "PAYPALISHIRING", numRows = 4
22+
# Output: "PINALSIGYAHRPI"
23+
# Explanation:
24+
# P I N
25+
# A L S I G
26+
# Y A H R
27+
# P I
28+
# Example 3:
29+
#
30+
# Input: s = "A", numRows = 1
31+
# Output: "A"
32+
#
33+
#
34+
# Constraints:
35+
#
36+
# 1 <= s.length <= 1000
37+
# s consists of English letters (lower-case and upper-case), ',' and '.'.
38+
# 1 <= numRows <= 1000
39+
40+
class Solution(object):
41+
def convert(self, s, numRows):
42+
"""
43+
:type s: str
44+
:type numRows: int
45+
:rtype: str
46+
"""
47+
if numRows == 1 or numRows >= len(s):
48+
return s
49+
50+
L = [''] * numRows
51+
index, step = 0, 1
52+
53+
for x in s:
54+
print(L, index, step, x)
55+
L[index] += x
56+
if index == 0:
57+
step = 1
58+
elif index == numRows - 1:
59+
step = -1
60+
index += step
61+
62+
return ''.join(L)
63+
64+
65+
if __name__ == '__main__':
66+
result = Solution().convert('PAYPALISHIRING', 4)
67+
print(result)

difference-between-2-timestamps.py

Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,22 @@
1+
from datetime import datetime
2+
# Import the library
3+
import argparse
4+
# Create the parser
5+
import pytz
6+
7+
parser = argparse.ArgumentParser()
8+
# Add an argument
9+
parser.add_argument('--earlier', type=str, required=True)
10+
# Add another argument
11+
parser.add_argument('--later', type=str, required=False, default=None)
12+
# Parse the argument
13+
args = parser.parse_args()
14+
# # Print "Hello" + the user input argument
15+
# print('Hello,', args.name)
16+
datetime_earlier = datetime.strptime(args.earlier, '%Y-%m-%dT%H:%M:%S.%f%z')
17+
if args.later:
18+
datetime_later = datetime.strptime(args.later, '%Y-%m-%dT%H:%M:%S.%f%z')
19+
else:
20+
datetime_later = datetime.utcnow().replace(tzinfo=pytz.utc)
21+
diff = (datetime_later - datetime_earlier)
22+
print(str(diff))

requirements.txt

Lines changed: 10 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1 +1,10 @@
1-
django
1+
boto3==1.18.34
2+
botocore==1.21.34
3+
grpcio==1.38.0
4+
grpcio-tools==1.38.0
5+
jmespath==0.10.0
6+
protobuf==3.17.1
7+
python-dateutil==2.8.2
8+
s3transfer==0.5.0
9+
six==1.16.0
10+
urllib3==1.26.6

0 commit comments

Comments
 (0)