Skip to content

Commit f84e428

Browse files
committed
weekly contest
1 parent ef74fa1 commit f84e428

3 files changed

+76
-0
lines changed
Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,10 @@
1+
def findValidPair(s: str) -> str:
2+
for i in range(1, len(s)):
3+
if s[i] != s[i - 1] and s.count(s[i]) == int(s[i]) and s.count(s[i - 1]) == int(s[i - 1]):
4+
return s[i - 1] + s[i]
5+
return ""
6+
7+
8+
print(findValidPair("2523533"))
9+
print(findValidPair("221"))
10+
print(findValidPair("22"))
Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,28 @@
1+
# https://leetcode.com/problems/reschedule-meetings-for-maximum-free-time-i
2+
# Sliding window approach, window size = k + 1
3+
# The max contiguous we can get from a window is (length - sum of interval lengths inside)
4+
# We can think of this as putting all intervals in the window next to each other
5+
6+
7+
def maxFreeTime(eventTime: int, k: int, startTime: list[int], endTime: list[int]) -> int:
8+
removed = 0
9+
startTime = [0] + startTime + [eventTime]
10+
endTime = [0] + endTime + [eventTime]
11+
12+
best = 0
13+
for i, (s, e) in enumerate(zip(startTime, endTime)):
14+
removed += e - s
15+
16+
li = i - (k + 1)
17+
if li >= 0:
18+
removed -= endTime[li] - startTime[li]
19+
cur_le = e - endTime[li] - removed
20+
best = max(best, cur_le)
21+
22+
return best
23+
24+
25+
print(maxFreeTime(eventTime=19, k=2, startTime=[1, 5, 11, 14], endTime=[3, 7, 13, 17]))
26+
print(maxFreeTime(eventTime=5, k=1, startTime=[1, 3], endTime=[2, 5]))
27+
print(maxFreeTime(eventTime=10, k=1, startTime=[0, 2, 9], endTime=[1, 4, 10]))
28+
print(maxFreeTime(eventTime=5, k=2, startTime=[0, 1, 2, 3, 4], endTime=[1, 2, 3, 4, 5]))
Lines changed: 38 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,38 @@
1+
# https://leetcode.com/problems/reschedule-meetings-for-maximum-free-time-ii
2+
# For each interval, check if we can move it somewhere else
3+
# We can od this by maintaining all 'gaps' in a SortedList
4+
5+
from sortedcontainers import SortedList
6+
7+
8+
def maxFreeTime(eventTime: int, startTime: list[int], endTime: list[int]) -> int:
9+
startTime = [0, 0] + startTime + [eventTime, eventTime] # padding
10+
endTime = [0, 0] + endTime + [eventTime, eventTime]
11+
12+
gaps = SortedList([startTime[i] - endTime[i - 1] for i in range(1, len(endTime))])
13+
14+
best = 0
15+
for i in range(1, len(endTime) - 1):
16+
l = startTime[i] - endTime[i - 1] # remove gaps right next to this interval
17+
r = startTime[i + 1] - endTime[i]
18+
gaps.remove(l)
19+
gaps.remove(r)
20+
21+
le = endTime[i] - startTime[i]
22+
if gaps and le <= gaps[-1]: # we can move this interval somewhere else
23+
cur_le = startTime[i + 1] - endTime[i - 1]
24+
else: # we cannot move it somewhere else, instead push it to the left to make as much space as possible
25+
cur_le = startTime[i + 1] - endTime[i - 1] - (endTime[i] - startTime[i])
26+
best = max(best, cur_le)
27+
28+
gaps.add(l) # add the gaps back now that we are done
29+
gaps.add(r)
30+
return best
31+
32+
33+
print(maxFreeTime(eventTime=19, startTime=[1, 5, 11, 14], endTime=[3, 8, 13, 17]))
34+
35+
print(maxFreeTime(eventTime=5, startTime=[1, 3], endTime=[2, 5]))
36+
print(maxFreeTime(eventTime=10, startTime=[0, 7, 9], endTime=[1, 8, 10]))
37+
print(maxFreeTime(eventTime=10, startTime=[0, 3, 7, 9], endTime=[1, 4, 8, 10]))
38+
print(maxFreeTime(eventTime=5, startTime=[0, 1, 2, 3, 4], endTime=[1, 2, 3, 4, 5]))

0 commit comments

Comments
 (0)