LeetCode 题解工作台
处理用时最长的那个任务的员工
共有 n 位员工,每位员工都有一个从 0 到 n - 1 的唯一 id 。 给你一个二维整数数组 logs ,其中 logs[i] = [id i , leaveTime i ] : id i 是处理第 i 个任务的员工的 id ,且 leaveTime i 是员工完成第 i 个任务的时刻。所有 l…
1
题型
7
代码语言
3
相关题
当前训练重点
简单 · 数组·driven
答案摘要
我们用变量 记录上一个任务的结束时间,用变量 记录最长的工作时间,用变量 记录工作时间最长且 最小的员工。初始时,三个变量均为 。 接下来,遍历数组 ,对于每个员工,我们将员工完成任务的时间减去上一个任务的结束时间,即可得到该员工的工作时间 。如果 小于 ,或者 等于 且该员工的 小于 ,则更新 和 。然后我们将 更新为上一个任务的结束时间加上 。继续遍历,直到遍历完整个数组。
Interview AiBoxInterview AiBox 实时 AI 助手,陪你讲清 数组·driven 题型思路
题目描述
共有 n 位员工,每位员工都有一个从 0 到 n - 1 的唯一 id 。
给你一个二维整数数组 logs ,其中 logs[i] = [idi, leaveTimei] :
idi是处理第i个任务的员工的 id ,且leaveTimei是员工完成第i个任务的时刻。所有leaveTimei的值都是 唯一 的。
注意,第 i 个任务在第 (i - 1) 个任务结束后立即开始,且第 0 个任务从时刻 0 开始。
返回处理用时最长的那个任务的员工的 id 。如果存在两个或多个员工同时满足,则返回几人中 最小 的 id 。
示例 1:
输入:n = 10, logs = [[0,3],[2,5],[0,9],[1,15]] 输出:1 解释: 任务 0 于时刻 0 开始,且在时刻 3 结束,共计 3 个单位时间。 任务 1 于时刻 3 开始,且在时刻 5 结束,共计 2 个单位时间。 任务 2 于时刻 5 开始,且在时刻 9 结束,共计 4 个单位时间。 任务 3 于时刻 9 开始,且在时刻 15 结束,共计 6 个单位时间。 时间最长的任务是任务 3 ,而 id 为 1 的员工是处理此任务的员工,所以返回 1 。
示例 2:
输入:n = 26, logs = [[1,1],[3,7],[2,12],[7,17]] 输出:3 解释: 任务 0 于时刻 0 开始,且在时刻 1 结束,共计 1 个单位时间。 任务 1 于时刻 1 开始,且在时刻 7 结束,共计 6 个单位时间。 任务 2 于时刻 7 开始,且在时刻 12 结束,共计 5 个单位时间。 任务 3 于时刻 12 开始,且在时刻 17 结束,共计 5 个单位时间。 时间最长的任务是任务 1 ,而 id 为 3 的员工是处理此任务的员工,所以返回 3 。
示例 3:
输入:n = 2, logs = [[0,10],[1,20]] 输出:0 解释: 任务 0 于时刻 0 开始,且在时刻 10 结束,共计 10 个单位时间。 任务 1 于时刻 10 开始,且在时刻 20 结束,共计 10 个单位时间。 时间最长的任务是任务 0 和 1 ,处理这两个任务的员工的 id 分别是 0 和 1 ,所以返回最小的 0 。
提示:
2 <= n <= 5001 <= logs.length <= 500logs[i].length == 20 <= idi <= n - 11 <= leaveTimei <= 500idi != idi + 1leaveTimei按严格递增顺序排列
解题思路
方法一:直接遍历
我们用变量 记录上一个任务的结束时间,用变量 记录最长的工作时间,用变量 记录工作时间最长且 最小的员工。初始时,三个变量均为 。
接下来,遍历数组 ,对于每个员工,我们将员工完成任务的时间减去上一个任务的结束时间,即可得到该员工的工作时间 。如果 小于 ,或者 等于 且该员工的 小于 ,则更新 和 。然后我们将 更新为上一个任务的结束时间加上 。继续遍历,直到遍历完整个数组。
最后返回答案 即可。
时间复杂度 ,其中 为数组 的长度。空间复杂度 。
class Solution:
def hardestWorker(self, n: int, logs: List[List[int]]) -> int:
last = mx = ans = 0
for uid, t in logs:
t -= last
if mx < t or (mx == t and ans > uid):
ans, mx = uid, t
last += t
return ans
复杂度分析
| 指标 | 值 |
|---|---|
| 时间 | complexity is O(m) where m is the number of tasks in logs since we iterate once through the array. Space complexity is O(1) because we only maintain a few variables regardless of input size. |
| 空间 | Depends on the final approach |
面试官常问的追问
外企场景- question_mark
Expect array-driven calculations without sorting logs again.
- question_mark
Check for tie-breaking using the smallest employee ID for identical durations.
- question_mark
Ensure edge cases handle the first task starting at time 0 correctly.
常见陷阱
外企场景- error
Forgetting that the first task duration is just leaveTime[0] minus 0.
- error
Not handling ties correctly when multiple employees have the same longest task.
- error
Using previous employee IDs incorrectly instead of comparing task durations properly.
进阶变体
外企场景- arrow_right_alt
Find the employee with the shortest task instead of the longest using the same array approach.
- arrow_right_alt
Return all employees tied for the longest task as a list, sorted by ID.
- arrow_right_alt
Given logs are unsorted, first sort by leaveTime before applying the same array-driven method.