|
| 1 | +# 1834. Single-Threaded CPU |
| 2 | + |
| 3 | +- Difficulty: Medium. |
| 4 | +- Related Topics: Array, Sorting, Heap (Priority Queue). |
| 5 | +- Similar Questions: Parallel Courses III, Minimum Time to Complete All Tasks. |
| 6 | + |
| 7 | +## Problem |
| 8 | + |
| 9 | +You are given `n` tasks labeled from `0` to `n - 1` represented by a 2D integer array `tasks`, where `tasks[i] = [enqueueTimei, processingTimei]` means that the `ith` task will be available to process at `enqueueTimei` and will take `processingTimei` to finish processing. |
| 10 | + |
| 11 | +You have a single-threaded CPU that can process **at most one** task at a time and will act in the following way: |
| 12 | + |
| 13 | + |
| 14 | + |
| 15 | +- If the CPU is idle and there are no available tasks to process, the CPU remains idle. |
| 16 | + |
| 17 | +- If the CPU is idle and there are available tasks, the CPU will choose the one with the **shortest processing time**. If multiple tasks have the same shortest processing time, it will choose the task with the smallest index. |
| 18 | + |
| 19 | +- Once a task is started, the CPU will **process the entire task** without stopping. |
| 20 | + |
| 21 | +- The CPU can finish a task then start a new one instantly. |
| 22 | + |
| 23 | + |
| 24 | +Return **the order in which the CPU will process the tasks.** |
| 25 | + |
| 26 | + |
| 27 | +Example 1: |
| 28 | + |
| 29 | +``` |
| 30 | +Input: tasks = [[1,2],[2,4],[3,2],[4,1]] |
| 31 | +Output: [0,2,3,1] |
| 32 | +Explanation: The events go as follows: |
| 33 | +- At time = 1, task 0 is available to process. Available tasks = {0}. |
| 34 | +- Also at time = 1, the idle CPU starts processing task 0. Available tasks = {}. |
| 35 | +- At time = 2, task 1 is available to process. Available tasks = {1}. |
| 36 | +- At time = 3, task 2 is available to process. Available tasks = {1, 2}. |
| 37 | +- Also at time = 3, the CPU finishes task 0 and starts processing task 2 as it is the shortest. Available tasks = {1}. |
| 38 | +- At time = 4, task 3 is available to process. Available tasks = {1, 3}. |
| 39 | +- At time = 5, the CPU finishes task 2 and starts processing task 3 as it is the shortest. Available tasks = {1}. |
| 40 | +- At time = 6, the CPU finishes task 3 and starts processing task 1. Available tasks = {}. |
| 41 | +- At time = 10, the CPU finishes task 1 and becomes idle. |
| 42 | +``` |
| 43 | + |
| 44 | +Example 2: |
| 45 | + |
| 46 | +``` |
| 47 | +Input: tasks = [[7,10],[7,12],[7,5],[7,4],[7,2]] |
| 48 | +Output: [4,3,2,0,1] |
| 49 | +Explanation: The events go as follows: |
| 50 | +- At time = 7, all the tasks become available. Available tasks = {0,1,2,3,4}. |
| 51 | +- Also at time = 7, the idle CPU starts processing task 4. Available tasks = {0,1,2,3}. |
| 52 | +- At time = 9, the CPU finishes task 4 and starts processing task 3. Available tasks = {0,1,2}. |
| 53 | +- At time = 13, the CPU finishes task 3 and starts processing task 2. Available tasks = {0,1}. |
| 54 | +- At time = 18, the CPU finishes task 2 and starts processing task 0. Available tasks = {1}. |
| 55 | +- At time = 28, the CPU finishes task 0 and starts processing task 1. Available tasks = {}. |
| 56 | +- At time = 40, the CPU finishes task 1 and becomes idle. |
| 57 | +``` |
| 58 | + |
| 59 | + |
| 60 | +**Constraints:** |
| 61 | + |
| 62 | + |
| 63 | + |
| 64 | +- `tasks.length == n` |
| 65 | + |
| 66 | +- `1 <= n <= 105` |
| 67 | + |
| 68 | +- `1 <= enqueueTimei, processingTimei <= 109` |
| 69 | + |
| 70 | + |
| 71 | + |
| 72 | +## Solution |
| 73 | + |
| 74 | +```javascript |
| 75 | +/** |
| 76 | + * @param {number[][]} tasks |
| 77 | + * @return {number[]} |
| 78 | + */ |
| 79 | +var getOrder = function(tasks) { |
| 80 | + var arr = tasks.map((task, i) => [task[0], task[1], i]).sort((a, b) => a[0] - b[0]); |
| 81 | + |
| 82 | + var queue = new MinPriorityQueue(); |
| 83 | + var i = 0; |
| 84 | + var res = []; |
| 85 | + var lastTime = 0; |
| 86 | + while (i < arr.length || queue.size()) { |
| 87 | + if (!queue.size() && arr[i][0] > lastTime) { |
| 88 | + lastTime = arr[i][0]; |
| 89 | + } |
| 90 | + |
| 91 | + while (arr[i] && arr[i][0] <= lastTime) { |
| 92 | + var priority = arr[i][1] + (arr[i][2] / Math.pow(10, `${arr.length}`.length)); |
| 93 | + queue.enqueue(arr[i], priority); |
| 94 | + i++; |
| 95 | + } |
| 96 | + |
| 97 | + var task = queue.dequeue().element; |
| 98 | + res.push(task[2]); |
| 99 | + lastTime += task[1]; |
| 100 | + } |
| 101 | + |
| 102 | + return res; |
| 103 | +}; |
| 104 | +``` |
| 105 | + |
| 106 | +**Explain:** |
| 107 | + |
| 108 | +nope. |
| 109 | + |
| 110 | +**Complexity:** |
| 111 | + |
| 112 | +* Time complexity : O(n). |
| 113 | +* Space complexity : O(n). |
0 commit comments