1. 程式人生 > 實用技巧 >力扣——621. 任務排程器

力扣——621. 任務排程器

題目:

給你一個用字元陣列 tasks 表示的 CPU 需要執行的任務列表。其中每個字母表示一種不同種類的任務。任務可以以任意順序執行,並且每個任務都可以在 1 個單位時間內執行完。在任何一個單位時間,CPU 可以完成一個任務,或者處於待命狀態。
然而,兩個 相同種類 的任務之間必須有長度為整數 n 的冷卻時間,因此至少有連續 n 個單位時間內 CPU 在執行不同的任務,或者在待命狀態。
你需要計算完成所有任務所需要的 最短時間 。
來源:力扣(LeetCode)
連結:https://leetcode-cn.com/problems/task-scheduler/

示例1:
輸入:tasks = ["A"
,"A","A","B","B","B"], n = 2 輸出:8 解釋:A -> B -> (待命) -> A -> B -> (待命) -> A -> B 在本示例中,兩個相同型別任務之間必須間隔長度為 n = 2 的冷卻時間,而執行一個任務只需要一個單位時間,所以中間出現了(待命)狀態。 示例2: 輸入:tasks = ["A","A","A","B","B","B"], n = 0 輸出:6 解釋:在這種情況下,任何大小為 6 的排列都可以滿足要求,因為 n = 0 ["A","A","A","B","B","B"] ["A","B"
,"A","B","A","B"] ["B","B","B","A","A","A"] ... 諸如此類 示例3: 輸入:tasks = ["A","A","A","A","A","A","B","C","D","E","F","G"], n = 2 輸出:16 解釋:一種可能的解決方案是: A -> B -> C -> A -> D -> E -> A -> F -> G -> A -> (待命) -> (待命) -> A -> (待命) -> (待命) -> A
  • 1 <= task.length <= 104
  • tasks[i] 是大寫英文字母
  • n 的取值範圍為 [0, 100]

這個題主講得太好了,他用到了桶思想,我想記錄一下,下方是連線

https://leetcode-cn.com/problems/task-scheduler/solution/tong-zi-by-popopop/

//這裡我們先找到出現次數最多的任務,假設max=6,那麼就設定6個桶,每個桶的大小是n+1。一直填桶,我們會發現執行時間是(桶數-1)*(n+1)+最後一個桶的任務數。
//假設我們所有桶都填滿了,但是還有多餘的任務怎麼辦呢?我們可以擴充桶的大小,即插入前面的桶裡面,無論我們怎麼插,都是滿足冷卻時間了,所以此時時間就是任務數。
class
Solution { public: int leastInterval(vector<char>& tasks, int n) { if(n==0) return tasks.size(); vector<int> hash(26); for(char ch:tasks){ hash[ch-'A']++; } sort(hash.rbegin(),hash.rend()); //升序排序 int len=tasks.size(); int last=1; //記錄最後一個桶的任務數 while(last<hash.size()&&hash[last]==hash[0]) last++; return max(len,last+(hash[0]-1)*(n+1)); } };