給定乙個用字元陣列表示的 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.
在本示例中,兩個相同型別任務之間必須間隔長度為 n =
2 的冷卻時間,而執行乙個任務只需要乙個單位時間,所以中間出現了(待命)狀態。
任務的總個數為 [1, 10000]。
n 的取值範圍為 [0, 100]。
dict.get(key, default=none)
引數:key – 字典中要查詢的鍵。
default – 如果指定鍵的值不存在時,返回該預設值。
返回值:返回指定鍵的值,如果鍵不在字典中返回預設值 none 或者設定的預設值。
class
solution
:def
leastinterval
(self, tasks: list[
str]
, n:
int)
->
int:
l =len(tasks)
if l <1:
return l
tasks_map =
dict()
for i in tasks:
tasks_map[i]
= tasks_map.get(i,0)
+1tasks_max =
max(tasks_map.values())
res =
(tasks_max -1)
*(n +1)
for key in tasks_map.keys():
if tasks_map[key]
== tasks_max:
res +=
1return res if res >= l else l
完成所有任務的最短時間取決於出現次數最多的任務數量
看下題目給出的例子
輸入: tasks =
["a"
,"a"
,"a"
,"b"
,"b"
,"b"
], n =
2輸出:
8執行順序: a -
> b -
>
(待命)
-> a -
> b -
>
(待命)
-> a -
> b.
a -> (單位時間) -> (單位時間) -> a -> (單位時間) -> (單位時間) -> a
中間間隔的單位時間可以用來安排別的任務,也可以處於「待命」狀態。當然,為了使總任務時間最短,我們要盡可能地把單位時間分配給其他任務。現在把任務 b 安排上:
a -> b -> (單位時間) -> a -> b -> (單位時間) -> a -> b
很容易觀察到,前面兩個 a 任務一定會固定跟著 2 個單位時間的間隔。最後乙個 a 之後是否還有任務跟隨取決於是否存在與任務 a 出現次數相同的任務。
該例子的計算過程為:
(任務 a 出現的次數 - 1) * (n + 1) + (出現次數為 3 的任務個數),即:
(3 - 1) * (2 + 1) + 2 = 8
所以整體的解題步驟如下:
計算每個任務出現的次數
找出出現次數最多的任務,假設出現次數為 x
計算至少需要的時間 (x - 1) * (n + 1),記為 min_time
計算出現次數為 x 的任務總數 count,計算最終結果為 min_time + count
特殊情況
然而存在一種特殊情況,例如:
輸入: tasks =
["a"
,"a"
,"a"
,"b"
,"b"
,"b"
,"c"
,"c"
,"d"
,"d"
], n =
2輸出:
10執行順序: a -
> b -
> c -
> a -
> b -
> d -
> a -
> b -
> c -
> d
此時如果按照上述方法計算將得到結果為 8,比陣列總長度 10 要小,應返回陣列長度。 leetcode 任務排程器
給定乙個用字元陣列表示的 cpu 需要執行的任務列表。其中包含使用大寫的 a z 字母表示的26 種不同種類的任務。任務可以以任意順序執行,並且每個任務都可以在 1 個單位時間內執行完。cpu 在任何乙個單位時間內都可以執行乙個任務,或者在待命狀態。然而,兩個相同種類的任務之間必須有長度為 n 的冷...
任務排程器演算法(leetcode621)
題目描述如下 思路 要想完成任務的時間最短,那麼必須優先處理出現次數最多的任務 如果將次數多的任務留到最後,必然在每次任務之間留出大量的等待時間 因此我們可以以n 1個任務為一輪 保證同一種任務不出現在同一輪 每一輪按出現次數順序從大到小執行,每完成一輪就重新排序依次,直到所有任務完成 例如 aaa...
任務排程器
leetcode621 解題思路一 排序 規定n 1個任務為一輪,保證同一輪中乙個任務最多只能被安排一次。在每一輪中,將當前的任務按照它們剩餘的次數降序排序,並選擇剩餘次數最多的n 1個任務依次執行。如果任務的中種類t n 1,則只能選擇全部的t種任務,其餘時間空閒。也就是利用貪心,因為冷卻時間的存...