|
| 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