题目
你有一台电脑,它可以 同时 运行无数个任务。给你一个二维整数数组
tasks
,其中 tasks[i] = [starti, endi, durationi]
表示第 i
个任务需要在 闭区间 时间段 [starti, endi]
内运行 durationi
个整数时间点(但不需要连续)。当电脑需要运行任务时,你可以打开电脑,如果空闲时,你可以将电脑关闭。
请你返回完成所有任务的情况下,电脑最少需要运行多少秒。
示例 1:
输入:tasks = [[2,3,1],[4,5,1],[1,5,2]] 输出:2 解释: - 第一个任务在闭区间 [2, 2] 运行。 - 第二个任务在闭区间 [5, 5] 运行。 - 第三个任务在闭区间 [2, 2] 和 [5, 5] 运行。 电脑总共运行 2 个整数时间点。
示例 2:
输入:tasks = [[1,3,2],[2,5,3],[5,6,2]] 输出:4 解释: - 第一个任务在闭区间 [2, 3] 运行 - 第二个任务在闭区间 [2, 3] 和 [5, 5] 运行。 - 第三个任务在闭区间 [5, 6] 运行。 电脑总共运行 4 个整数时间点。
提示:
1 <= tasks.length <= 2000
tasks[i].length == 3
1 <= starti, endi <= 2000
1 <= durationi <= endi - starti + 1
解法
将 tasks 按照 end 时间升序排列之后,我们发现,对于 tasks[i] 来说,如果它在之前的时间已经运行完了,这是最好的,如果没运行完(还剩下 d 分钟需要运行),那么我们还需要在[start, end] 中选出 d 分钟的空闲时间来让电脑运行。
我们希望这 d 分钟越靠后越好,因为这样可以尽可能地与后面的任务重叠,让更多后面的任务受益。
代码
class Solution: def findMinimumTime(self, tasks: List[List[int]]) -> int: tasks.sort(key = lambda x: x[1]) run = [False] * (tasks[-1][1] + 1) for [start, end, duration] in tasks: runTime = sum(run[start: end+1]) moreTime = duration - runTime for t in range(end, start-1, -1): if moreTime <= 0: break if not run[t]: moreTime -= 1 run[t] = True return sum(run)
复杂度
- 时间复杂度: O(n)
- 空间复杂度: O(n)