前言
今天也是很無精打采的一天,早上看到這道題,都有點懵逼,開始也不懂如何入手,既然自己搞不定,就順便測試了一下AI吧,測試了通義千問和文心一言,把題目拿去那里問,可以把解題思路寫出來,代碼也寫了,但是我拿到AI的代碼來運行,發現2個平臺的代碼都是運行不通過的,說明AI對這種算法題,是不對的,AI測試了一輪,只好自己去理解了,看了一下AI的代碼,給自己一些思路,按照自己的思路去優化代碼最終通過。
題目
2589. 完成所有任務的最少時間
你有一臺電腦,它可以?同時?運行無數個任務。給你一個二維整數數組?tasks
?,其中?tasks[i] = [starti, endi, durationi]
?表示第?i
?個任務需要在?閉區間?時間段?[starti, endi]
?內運行?durationi
?個整數時間點(但不需要連續)。
當電腦需要運行任務時,你可以打開電腦,如果空閑時,你可以將電腦關閉。
請你返回完成所有任務的情況下,電腦最少需要運行多少秒。
示例 1:
輸入:tasks = [[2,3,1],[4,5,1],[1,5,2]] 輸出:2 解釋: - 第一個任務在閉區間 [2, 2] 運行。 - 第二個任務在閉區間 [5, 5] 運行。 - 第三個任務在閉區間 [2, 2] 和 [5, 5] 運行。 電腦總共運行 2 個整數時間點。
示例 2:
輸入:tasks = [[1,3,2],[2,5,3],[5,6,2]] 輸出:4 解釋: - 第一個任務在閉區間 [2, 3] 運行 - 第二個任務在閉區間 [2, 3] 和 [5, 5] 運行。 - 第三個任務在閉區間 [5, 6] 運行。 電腦總共運行 4 個整數時間點。
提示:
1 <= tasks.length <= 2000
tasks[i].length == 3
1 <= starti, endi <= 2000
1 <= durationi <= endi - starti + 1
解題思路
- 按照end時間進行排序
- mark數組標記那些時刻已經被使用了。
- 遍歷每一個task,按照該task的執行時間段從大到小占用時刻,直到滿足時間占用==duration為止。
代碼
class Solution {public int findMinimumTime(int[][] tasks) {// 按照結束時間排序Arrays.sort(tasks, Comparator.comparingInt(a -> a[1]));int ans = 0; // 電腦的總運行時間boolean[] used = new boolean[2024];for (int[] task : tasks) {int start = task[0];int end = task[1];int duration = task[2];for (int j = start; j <= end; j++) {if (used[j]) {duration--;}}for (int j = end; duration > 0; j--) {if (!used[j]) {ans++;used[j] = true;duration--;}}}return ans;}
}
每一次的記錄,都是一次學習。