Easy
题目描述
给你一个二维整数数组 tasks,其中 tasks[i] = [si, ti]。
tasks 中的每个 [si, ti] 表示一个任务,该任务在时间 si 开始,需要 ti 个时间单位才能完成。
返回至少完成一个任务的最早时间。
示例 1:
输入:tasks = [[1,6],[2,3]]
输出:5
解释:
第一个任务在时间 t = 1 开始,在时间 1 + 6 = 7 完成。
第二个任务在时间 2 + 3 = 5 完成。
你可以在时间 5 完成一个任务。
示例 2:
输入:tasks = [[100,100],[100,100],[100,100]]
输出:200
解释:
所有三个任务都在时间 100 + 100 = 200 完成。
约束条件:
1 <= tasks.length <= 100tasks[i] = [si, ti]1 <= si, ti <= 100
解题思路
这是一道简单的数组题目,关键在于理解题意:我们需要找到所有任务中最早完成的那个任务的完成时间。
解题思路:
每个任务的完成时间等于开始时间加上持续时间,即 finish_time = start_time + duration。我们需要计算所有任务的完成时间,然后返回其中的最小值。
具体步骤:
- 遍历所有任务
- 对于每个任务
[si, ti],计算其完成时间si + ti - 维护一个最小完成时间,不断更新为更小的值
- 返回最小完成时间
这个问题的核心是理解任务的完成时间计算方式,以及找到多个数值中的最小值。时间复杂度为 O(n),空间复杂度为 O(1),其中 n 是任务数量。
推荐解法: 一次遍历求最小值,简洁高效。
代码实现
class Solution {
public:
int earliestTime(vector<vector<int>>& tasks) {
int minTime = INT_MAX;
for (const auto& task : tasks) {
int finishTime = task[0] + task[1];
minTime = min(minTime, finishTime);
}
return minTime;
}
};
class Solution:
def earliestTime(self, tasks: List[List[int]]) -> int:
return min(start + duration for start, duration in tasks)
public class Solution {
public int EarliestTime(int[][] tasks) {
int minTime = int.MaxValue;
foreach (int[] task in tasks) {
int finishTime = task[0] + task[1];
minTime = Math.Min(minTime, finishTime);
}
return minTime;
}
}
var earliestTime = function(tasks) {
let minTime = Infinity;
for (let [start, duration] of tasks) {
let finishTime = start + duration;
minTime = Math.min(minTime, finishTime);
}
return minTime;
};
复杂度分析
| 复杂度类型 | 复杂度 | 说明 |
|---|---|---|
| 时间复杂度 | O(n) | 需要遍历所有 n 个任务计算完成时间 |
| 空间复杂度 | O(1) | 只使用常数额外空间存储最小时间 |