2589. 完成所有任务的最少时间

2589. 完成所有任务的最少时间

Tags
贪心

题目

你有一台电脑,它可以 同时 运行无数个任务。给你一个二维整数数组 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)