ETH官方钱包

前往
大廳
主題

LeetCode - 1701. Average Waiting Time 解題心得

Not In My Back Yard | 2024-08-09 12:00:19 | 巴幣 2 | 人氣 40

題目連結:


題目意譯:
現在有一間餐廳,裡面只有一位廚師。你被給定一個陣列 customers,其中 customers[i] = [arrivali, timei]:
    arrivali 為第 i 位顧客的抵達時間。這些抵達時間將會以非遞減之序排序。
    timei 是為第 i 位顧客準備其料理訂單的所需時間。

當一位顧客抵達時,他將會給予廚師其訂單,而廚師將會在閒置時開始準備該顧客的料理。顧客將會一直等待直到訂單被完成為止。廚師一次只會為一位顧客準備其料理。廚師會依照顧客們給定的順序來準備他們的料理。

回傳所有顧客的平均等待時間。與實際答案誤差 10 ^ (-5) 以內的答案將會視為是正確的。

限制:
1 ≦ customers.length ≦ 10 ^ 5
1 ≦ arrivali, timei ≦ 10 ^ 4
arrivali ≦ arrivali+1



範例測資:
範例 1:
輸入: customers = [[1,2],[2,5],[4,3]]
輸出: 5.00000
解釋:
1) 第一位顧客於時間 1 時抵達,廚師在時間 1 時立刻開始準備其料理訂單,並在時間 3 時完成 所以第一位顧客的等待時間為 3 - 1 = 2。
2) 第二位顧客於時間 2 時抵達,廚師在時間 3 時開始準備其料理訂單,並在時間 8 時完成 所以第二位顧客的等待時間為 8 - 2 = 6。
3) 第三位顧客於時間 4 時抵達,廚師在時間 8 時開始準備其料理訂單,並在時間 11 時完成 所以第三位顧客的等待時間為 11 - 4 = 7。
所以平均等待時間 = (2 + 6 + 7) / 3 = 5。

範例 2:
輸入: customers = [[5,2],[5,4],[10,3],[20,1]]
輸出: 3.25000
解釋:
1) 第一位顧客於時間 5 時抵達,廚師在時間 5 時立刻開始準備其料理訂單,並在時間 7 時完成 所以第一位顧客的等待時間為 7 - 5 = 2。
2) 第二位顧客於時間 5 時抵達,廚師在時間 7 時開始準備其料理訂單,並在時間 11 時完成 所以第二位顧客的等待時間為 11 - 5 = 6。
3) 第三位顧客於時間 10 時抵達,廚師在時間 11 時開始準備其料理訂單,並在時間 14 時完成 所以第三位顧客的等待時間為 14 - 10 = 4。
4) 第四位顧客於時間 20 時抵達,廚師在時間 20 時立刻開始準備其料理訂單,並在時間 21 時完成 所以第四位顧客的等待時間為 21 - 20 = 1。
所以平均等待時間 = (2 + 6 + 4 + 1) / 4 = 3.25。


解題思維:
這題的簡化版。本題甚至不需要優先佇列(Priority Queue),因為廚師只有一位。



由於廚師一次只會準備一份訂單,因此我們可以單純地用一個變數 T 來代表「現在的時間點」。一開始 T 為 0。

對於第 i 位顧客 customers[i],會有兩種情況。一種是 T < arrivali,此時廚師將會等到 arrivali 為止,因此 T 將會直接變成 arrivali;反之另一種為 T ≧ arrivali,此時顧客已經到了,所以當前時間 T 不變。

而這兩種情況可以簡寫成為 T = max(T, arrivali)。

經過上面的判斷之後,現在保證了第 i 位顧客已經抵達。因此廚師可以開始準備。因此時間將會移動到 timei 單位後。故 T = T + timei。

而第 i 位顧客的等待時間即為 T - arrivali。

將所有顧客的等待時間加總除以顧客總數即可。




此次分享到此為止,如有任何更加簡潔的想法或是有說明不清楚之地方,也煩請各位大大撥冗討論。

創作回應

更多創作