給你乙個用字元陣列tasks
表示的cpu需要執行的任務列表。其中每個字母表示一種不同種類的任務。任務可以以任意順序執行,並且每個任務都可以在1個單位時間內執行完。在任何乙個單位時間,cpu可以完成乙個任務,或者處於待命狀態。
然而,兩個相同種類的任務之間必須有長度為整數n
的冷卻時間,因此至少有連續n
個單位時間內cpu在執行不同的任務,或者在待命狀態。
你需要計算完成所有任務所需要的最短時間。
示例 1:
輸入:tasks = ["a","a","a","b","b","b"], n = 2
輸出:8
解釋:a -> b -> (待命) -> a -> b -> (待命) -> a -> b
在本示例中,兩個相同型別任務之間必須間隔長度為 n = 2 的冷卻時間,而執行乙個任務只需要乙個單位時間,所以中間出現了(待命)狀態。
public int leastinterval(char tasks, int n)
// 任務總數
int m = freq.size();
listnextvalid = new arraylist();
listrest = new arraylist();
set> entryset = freq.entryset();
for (map.entryentry : entryset)
int time = 0;
for (int i = 0; i < tasks.length; ++i)
} time = math.max(time, minnextvalid);
int best = -1;
for (int j = 0; j < m; ++j)
}} nextvalid.set(best, time + n + 1);
rest.set(best, rest.get(best) - 1);
} return time;
}
需要注意的是,執行任務是需要時間的,這裡第乙個任務執行完時time
為1
。
根據我們的策略,我們需要選擇不在冷卻中並且剩餘執行次數最多的那個任務。
這裡第乙個任務既可以是任務a,也可以是任務b,於是按照遍歷的順序,先執行任務a。
執行完第乙個任務a,任務a的執行次數減1
,同時任務a的下一次執行的time
為4
。
當time
為2
時,只能執行任務b。執行完第二個任務b,任務b的執行次數減1
,同時任務a的下一次執行的time
為5
。
當time
為3
時,發現任務a和任務b都在冷卻中,而任務a的time
離現在更近,所以直接跳到任務a的time
去執行任務a。
解釋**:
以下**表示跳到下乙個執行任務的time
。
// ...
time = math.max(time, minnextvalid);
// ...
以下**的rest.get(j) > rest.get(best)
表示選擇不在冷卻中並且剩餘執行次數最多的那個任務。
int best = -1;
for (int j = 0; j < m; ++j)
}}
public int leastinterval(char tasks, int n)
// 具有最多執行次數的任務數量
int maxcount = 0;
set> entryset = freq.entryset();
for (map.entryentry : entryset)
} return math.max((maxexec - 1) * (n + 1) + maxcount, tasks.length);
}
maxexec
為最多的執行次數,maxcount
為具有最多執行次數的任務數量,n
為任務的冷卻時間,tasks
為任務列表。以tasks = ["a","a","a"], n = 2
為例,我們使用乙個寬為n+1
的矩陣視覺化地展現執行任務a的時間點。
注意到這裡兩個任務a之間間隔兩個格仔,任務a正好都在同一列上,計算所需時間為(3 - 1)*(2 + 1) + 1 = 7
。
同理,以tasks = ["a","a","a","b","b","b"], n = 2
為例,計算所需時間為(3 - 1)*(2 + 1) + 2 = 8
。
如果maxcount > n + 1
,那麼計算所需的最短時間為任務的總數tasks.length
。
參考:
任務排程器
leetcode621 解題思路一 排序 規定n 1個任務為一輪,保證同一輪中乙個任務最多只能被安排一次。在每一輪中,將當前的任務按照它們剩餘的次數降序排序,並選擇剩餘次數最多的n 1個任務依次執行。如果任務的中種類t n 1,則只能選擇全部的t種任務,其餘時間空閒。也就是利用貪心,因為冷卻時間的存...
python celery 任務排程器
celery是python開發的分布式任務排程模組,今天抽空看了一下,果然介面簡單,開發容易,5分鐘就寫出了乙個非同步傳送郵件的服務。celery本身不含訊息服務,它使用第三方訊息服務來傳遞任務,目前,celery支援的訊息服務有rabbitmq redis甚至是資料庫,當然redis應該是最佳選擇...
任務排程器 Quartz
開發過程中需要用到定時任務,記錄一下配置過程 1 目標bean timingjob class com.quartz.timing.timingjobservice bean 2 jobdetail 排程任務 timingtrigger class org.springframework.sched...