leetcode 任務排程器 python3

2021-10-24 17:05:02 字數 2608 閱讀 4462

給定乙個用字元陣列表示的 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種任務,其餘時間空閒。也就是利用貪心,因為冷卻時間的存...