630. Course Schedule III
題目網址:https://leetcode.cn/problems/course-schedule-iii/
題意:有
n
個不同的課程, 編號從1
到n
。給一整數 arraycourse
, 其中courses[i] = [duration_i, lastDay_i]
代表第i
門課程會持續duration_i
天, 且須在lastDay_i
之前完成。學期從第
1
天開始, 且不得同時修習兩門(含)以上的課程。返回最多可修習的課程數目。
Solution:
想法:利用 Greedy + Heap, 由於我們希望能修習的課越多越好, 因此我們要先將課程根據 deadline 由小到大排序, 因為 deadline 越是緊急的課越應該優先完成, 完成後才接著去安排 deadline 相對寬鬆的課
- 將所有課程根據 deadline 由小到大排序
- 用 max heap
q
維護目前取的課程中 duration 最長的課- 按照 deadline 的順序, 一一嘗試加入課程。一旦有課程無法在 deadline 前完成, 則取消掉目前取的課程中 duration 最長的課
e.g.
courses = [[3, 5], [4, 7], [2, 8]]
- 第一天取
[3, 5]
在第三天時修完第一門, 然後取[4, 7]
於第 7 天完成第二門, 接著取[2, 8]
, 但是第三門無法在 deadline 前完成, 因為 7 + 2 = 9 > 8- 我們會希望在修習相同課程數的條件下,
days
能越小越好, 因為這樣後面課程才越有機會在 deadline 前完成- 所以我們取消掉
[4, 7]
, 因為它的 duration 最長。此時我們取了[3, 5]
和[2, 8]
這兩門課只花了 5 天, 而非[3, 5]
和[4, 7]
這樣需花 7 天。
class Solution { |
- time:$O(n \cdot log(n))$ ➔ 每次 heap 取出元素後, 需花 $O(log(n))$ 調整 heap, 總共取
n
次 - space:$O(n)$ ➔
q
中元素不超過n
個
本部落格所有文章除特別聲明外,均採用 CC BY-NC-SA 4.0 許可協議。轉載請註明來自 Zako's Blog!
評論