# Leetcode 2589. Minimum Time to Complete All Tasks
###### tags: `leetcode` `Contest`
[題目連結](https://leetcode.com/problems/minimum-time-to-complete-all-tasks/)
[TOC]
# Concept
對於這種 start, end 區間類型的題目,我們可以很容易聯想到使用sort做排序。
至於要根據start、end哪一個屬性做 sort,我們就必須根據題目定義來做處理。
## A. 根據 Start 做排序
我們可以清楚的知道 做完排序後, 一定會有先後順序關係,
假如我們根據 start 做排序:`tasks[i].start <= tasks[i+1].end`
:::warning
**我們可以很清楚的知道 對於 `tasks[i]` 這區間,**
**一定要選擇最後面的幾個數字,比較有機會與 `tasks[i+1]` 重疊**
:::
> Example: `tasks[i] = {1, 5, 2}`
>
> `tasks[i+1]` 可能會有三種況狀況
> 1. `tasks[i+1] = {6, 8, 2}`
> `tasks[i]` 無論怎麼選,都無法與 `tasks[i+1]` 重疊
>
> 2. `tasks[i+1] = {2, 3, 2}`
> `tasks[i]` 要選擇 `[2, 3]` 才有辦法與 `tasks[i+1]` 重疊
>
> 3. `tasks[i+1] = {4, 5, 2}`
> `tasks[i]` 要選擇 `[4, 5]` 才有辦法與 `tasks[i+1]` 重疊
>
> 從上面的三個例子我們可以看出:
> **這時候會陷入一個困難,選擇數字的範圍 會受到 `tasks[i+1].end` 所影響**
## B. 根據 End 做排序
從上面的例子的結論 我們可以改成從 `end` 來做排序試試看
> 1. `tasks[i] = {1, 5, 2}`,`tasks[i+1] = {6, 8, 2}`
> `tasks[i]` 選擇 `[4, 5]`,`tasks[i+1]` 選擇 `[7, 8]`
> 無論怎麼選都不會互相重疊
>
> 2. `tasks[i] = {2, 3, 2}`,`tasks[i+1] = {1, 5, 2}`
> `tasks[i]` 選擇 `[2, 3]`,`tasks[i+1]` 選擇 `[2, 3]`
>
> 3. `tasks[i] = {1, 5, 2}`,`tasks[i+1] = {4, 5, 2}`
> `tasks[i]` 選擇 `[4, 5]`,`tasks[i+1]` 選擇 `[4, 5]`
> **這邊需要特別小心 `end` 相同時, 需不需要特別考慮 `start`,**
> **從這個例子中看起來是不需要特別考慮的**
## C. 判斷重複出現過的數字
最後由於題目數據範圍是
* `1 <= tasks.length <= 2000`
* `1 <= start_i, end_i <= 2000`
因此我們對於使用過的數字使用 vector 來記錄哪些數字前面所使用過,對於每一個尋訪到的task,先把計算範圍內有哪些數字使用過,最後再從 `end -> start`,一個一個補上即可。
## 完整程式碼
`TC: O(NlogN)` `SC: O(N)`
```cpp=
class Solution {
public:
static bool cmp(vector<int> &a, vector<int> &b) {
return a[1] < b[1];
}
int findMinimumTime(vector<vector<int>>& tasks) {
int n = tasks.size();
int output = 0;
vector<bool> visited(2001, false);
sort(tasks.begin(), tasks.end(), cmp);
for(int i = 0 ; i < n ; i++) {
int start = tasks[i][0];
int end = tasks[i][1];
int count = tasks[i][2];
int owner = 0;
for(int j = start ; j <= end ; j++) {
owner += visited[j];
}
if(owner >= count) {
continue;
}
for(int j = end ; (j >= start) && (owner < count) ; j--) {
if(visited[j] == false) {
owner++;
visited[j] = true;
output++;
}
}
}
return output;
}
};
```
{%hackmd hjePmt98S8a_uls4-6_hNg %}