跳过正文
  1. leetcode 题解/

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

·187 字·1 分钟
目录

题目
#

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