题目 #
你有一台电脑,它可以 同时 运行无数个任务。给你一个二维整数数组 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 <= 2000tasks[i].length == 31 <= starti, endi <= 20001 <= 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)