leetcode
leetcode 1501 ~ 1550
平均等待时间

平均等待时间

难度:

标签:

题目描述

代码结果

运行时间: 59 ms, 内存: 46.7 MB


/*
 思路:
 1. 初始化一个 AtomicInteger 变量来记录当前时间(currentTime)。
 2. 使用 IntStream 来处理顾客数组:
    - mapToLong 将每个顾客映射到其等待时间。
    - 对于每个顾客,使用 compareAndSet 更新当前时间。
    - 计算并累加总等待时间。
 3. 最后返回总等待时间除以顾客数量,得到平均等待时间。
 */
import java.util.concurrent.atomic.AtomicInteger;
import java.util.stream.IntStream;

public class AverageWaitingTimeStream {
    public static double averageWaitingTime(int[][] customers) {
        AtomicInteger currentTime = new AtomicInteger(0);
        long totalWaitTime = IntStream.range(0, customers.length)
                                       .mapToLong(i -> {
                                           int arrivalTime = customers[i][0];
                                           int cookingTime = customers[i][1];
                                           int startTime = currentTime.updateAndGet(ct -> Math.max(ct, arrivalTime));
                                           currentTime.addAndGet(cookingTime);
                                           return startTime + cookingTime - arrivalTime;
                                       })
                                       .sum();
        return (double) totalWaitTime / customers.length;
    }
}

解释

方法:

此题解通过维护一个当前时间变量 k 来记录厨师何时完成当前顾客的菜。遍历每个顾客,比较厨师的空闲时间 k 与顾客到达时间 x。如果厨师在顾客到达前就空闲了,厨师将在顾客到达时立即开始制作,否则厨师会在处理完上一顾客后立即开始制作。每次厨师完成一个顾客的菜,更新时间 k,并计算该顾客的等待时间,存入 ans 列表。最后,计算所有顾客等待时间的平均值。

时间复杂度:

O(n)

空间复杂度:

O(n)

代码细节讲解

🦆
题解中的循环逻辑是直接遍历customers列表,是否考虑了所有可能的边界情况,例如顾客数组为空或只有一个顾客的情况?
题解的代码没有直接处理顾客数组为空的情况,这可能导致在初始化k的时候出现索引错误,因为customers[0][0]和customers[0][1]会在customers为空时引发异常。然而,对于只有一个顾客的情况,题解是有效的,因为它初始化k和m,然后直接返回m作为平均等待时间。为了使代码更健壮,应该在代码开始时加入对customers是否为空的检查,如果为空,则应该返回0或其他合适的值表示没有等待时间。

相关问题