处理用时最长的那个任务的员工

标签: 数组

难度: Easy

共有 n 位员工,每位员工都有一个从 0n - 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 <= 500
  • 1 <= logs.length <= 500
  • logs[i].length == 2
  • 0 <= idi <= n - 1
  • 1 <= leaveTimei <= 500
  • idi != idi + 1
  • leaveTimei 按严格递增顺序排列

Submission

运行时间: 36 ms

内存: 16.2 MB

class Solution:
    def hardestWorker(self, n: int, logs: List[List[int]]) -> int:
        for i in range(len(logs)-1, 0,-1):
            logs[i][1]=logs[i][1]-logs[i-1][1]
        time=0
        w=0
        for n in logs:
            if n[1]>time:
                time=n[1]
                w=n[0]
            elif n[1]==time:
                if n[0]<w:
                    w=n[0]
        return w

Explain

此题解采用了一种直接的方法来计算每个员工处理任务的时间,并找出处理时间最长的员工。首先,通过一个逆序循环,从后向前遍历logs数组,修改每个log的结束时间为当前任务的持续时间(当前任务结束时间减去上一个任务的结束时间)。这一步骤通过修改logs数组中的leaveTimei来实现,避免了使用额外的存储空间。接下来,遍历更新后的logs数组,比较每个任务的持续时间,保留最长时间及对应员工的id。如果多个任务持续时间相同,则选择id较小的员工。

时间复杂度: O(m)

空间复杂度: O(1)

# Solution class for finding the hardest worker based on task duration

class Solution:
    def hardestWorker(self, n: int, logs: List[List[int]]) -> int:
        # 修改logs数组,计算每个任务的持续时间
        for i in range(len(logs)-1, 0, -1):
            logs[i][1] = logs[i][1] - logs[i-1][1]
        # 初始化最长时间和相应的员工id
        time = 0
        w = 0
        # 遍历logs数组,找出最长任务时间和对应员工id
        for n in logs:
            if n[1] > time:
                time = n[1]
                w = n[0]
            elif n[1] == time:  # 如果时长相同,选择id较小的员工
                if n[0] < w:
                    w = n[0]
        return w