LeetCode 🟡 1894. Find the Student that Will Replace the Chalk
🔗 🟡 1894. Find the Student that Will Replace the Chalk 1356
tags: Biweekly Contest 54
陣列(Array)
模擬(Simulation)
前綴和(Prefix Sum)
二分搜尋(Binary Search)
題意
一個班級中有 個學生,編號從 到 。老師會從學生編號 開始給每個學生一個問題,然後是學生編號 ,依此類推,直到老師到達學生編號 。之後,老師會重新開始這個過程,再次從學生編號 開始。
給定一個長度為 且下標從 開始的整數陣列 和一個整數 。其中 表示一開始的粉筆數量,而 表示學生編號 會使用 個粉筆來解決問題。當粉筆數量嚴格少於 時,則學生編號 將被要求補充粉筆。
返回需要補充粉筆的學生編號。
思路
方法一:模擬(Simulation)
由於每一輪消耗的粉筆數量為 ,因此可以使用模運算來減少計算量,即 。這樣可以確保我們只需要考慮一輪內的情況。
在處理完 之後,直接模擬最後一輪的分發過程即可。以 表示剩餘的粉筆數量,當 時,表示第 個學生需要補充粉筆,返回 ,否則就減去 再遍歷下一個學生。
複雜度分析
- 時間複雜度:,其中 是學生的數量。需要遍歷一次 chalk 陣列來計算總和,然後最多再遍歷一次來找到需要補充粉筆的學生。
- 空間複雜度:,不考慮輸出入的空間。
1 | class Solution: |
1 | class Solution { |
方法二:前綴和(Prefix Sum) + 二分搜尋(Binary Search)
同樣只考慮最後一輪的情況,但反過來考慮被消耗的粉筆數量,令在最後一輪中輪到第 個學生時,消耗的粉筆數量為 ,則 ,即 的 前綴和(Prefix Sum) 。
由於剩餘的粉筆數量為 ,因此當 時,表示第 個學生需要補充粉筆。由於 是單調遞增的,因此可以使用 二分搜尋(Binary Search) 來找到 。
- 在 Python 中,可以使用
bisect.bisect_right
;在 C++ 中,則使用std::upper_bound
。
複雜度分析
- 時間複雜度:,其中 是學生的數量。
- 計算前綴和需要 時間。
- 二分搜尋需要 時間。
- 空間複雜度:,如果直接修改原陣列,則只需要 的空間(不考慮輸出入的空間)。
1 | class Solution: |
1 | class Solution { |
寫在最後
Cover photo is remixed from @吃肥皂泡泡, thanks for their work!
本部落格所有文章除特別聲明外,均採用 CC BY-NC-SA 4.0 許可協議。轉載請註明來自 十六個天亮!
評論
WalineGiscus