--- tags: leetcode --- # [1834. Single-Threaded CPU](https://leetcode.com/problems/single-threaded-cpu/) --- # My Solution ## The Key Idea for Solving This Coding Question 因為題目要求 `tasks[i]` 需在 `enqueueTime_i` 時,才能被 CPU 處理,所以先用排序演算法對 `tasks` 中所有元素依其 enqueueTime 做由小到大的排序。 CPU 會優先處理 processingTime 小的 task。當兩個 task 的 processingTime 相同時, CPU 會優先處理 index 較小的 task。所以我們可以用 heap (priority queue) 對 processingTime 與 index 對已經可以被處理的 task (`currTime >= enqTime`) 進行排序。也就是第 47 ~ 49 行。 第 40 ~ 46 行是在處理當 CPU 沒有工作做時 (即 `heap.empty()` 為 `true`),將下一個可以被處理的 task 放入 `heap` 中。這裡要注意的是 ==`currTime` 要被更新為 `currTime` 與 `taskList[i].enqTime` 的最大值==。 ## C++ Code ```cpp= struct taskData { int id; int enqTime; int procTime; taskData(int id, int enqTime, int procTime) : id(id), enqTime(enqTime), procTime(procTime) {} }; bool cmp(taskData &t1, taskData &t2) { return t1.enqTime < t2.enqTime; } class heapCmp { public: bool operator() (taskData &t1, taskData &t2) { if (t1.procTime > t2.procTime) { return true; } else if (t1.procTime < t2.procTime) { return false; } // t1.procTime == t2.procTime is true. return t1.id > t2.id; } }; class Solution { public: vector<int> getOrder(vector<vector<int>> &tasks) { vector<taskData> taskList; for (int i = 0; i < tasks.size(); ++i) { taskList.push_back(taskData(i, tasks[i][0], tasks[i][1])); } sort(taskList.begin(), taskList.end(), cmp); priority_queue<taskData, vector<taskData>, heapCmp> heap; unsigned long currTime = taskList[0].enqTime; vector<int> processedTasks; int i = 0; while (!heap.empty() || i < taskList.size()) { if (heap.empty()) { heap.push(taskList[i]); if (currTime < taskList[i].enqTime) { currTime = taskList[i].enqTime; } ++i; } while (i < taskList.size() && taskList[i].enqTime <= currTime) { heap.push(taskList[i++]); } currTime += heap.top().procTime; processedTasks.push_back(heap.top().id); heap.pop(); } return processedTasks; } }; ``` ## Time Complexity $O(nlogn)$ $n$ is the length of `tasks`. ## Space Complexity $O(n)$ # Miscellaneous <!-- # Test Cases ``` [[1,2],[2,4],[3,2],[4,1]] ``` ``` [[7,10],[7,12],[7,5],[7,4],[7,2]] ``` * Runtime Error: https://leetcode.com/submissions/detail/565931450/testcase/ * Wrong Answer ``` [[1,2],[2,4],[3,2],[3,2],[3,2],[4,1]] ``` -->