題目:https://leetcode-cn.com/problems/task-scheduler/description/
給定一個用字符數組表示的 CPU 需要執行的任務列表。其中包含使用大寫的 A - Z 字母表示的26 種不同種類的任務。任務可以以任意順序執行,並且每個任務都可以在 1 個單位時間內執行完。CPU 在任何一個單位時間內都可以執行一個任務,或者在待命狀態。
然而,兩個相同種類的任務之間必須有長度為 n 的冷卻時間,因此至少有連續 n 個單位時間內 CPU 在執行不同的任務,或者在待命狀態。
你需要計算完成所有任務所需要的最短時間。
示例:
輸入: tasks = ["A","A","A","B","B","B"], n = 2 輸出: 8 執行順序: A -> B -> (待命) -> A -> B -> (待命) -> A -> B.
注:
- 任務的總個數為 [1, 10000]。 (這個邊界點1??不就是1個單位時間。)
- n 的取值范圍為 [0, 100]。 (這個邊界點0???要謹慎了 0不就是直接執行一個又一個,長度也就是隊列長度。)
還真不會做,看了網上的各種答案,才領悟了。
思路:先排重復最多的,例如這題A - - A -- A -- (- 為間隔時間,間隔多少取決於n),然后其他元素依次插空 ,A B - A B - A B 。除去最后的A B 模塊 , 前面的模塊總執行時間 (m-1)*(n+1) , m為重復出現最多的次數 。最后模塊肯定有A自己一個,至於A后面填充什么,就看哪些元素種類個數和A一樣多 。最后不可能有待定了。
class Solution: def leastInterval(self, tasks, n): """ :type tasks: List[str] :type n: int :rtype: int """ length = len(tasks) if length==1: return 1 output = [0]*26 for i in tasks: output[ord(i)-ord('A')] = output[ord(i)-ord('A')]+1 count = 0 len_o = 0 max_o = max(output) for i in output: if i==max_o: count = count+1 return max(length,(max_o-1)*(n+1)+count)