621. 任務排程器 (構造)

lankerens發表於2020-12-05

LeetCode: 621. 任務排程器

題目與上題相同

部落格指路; 621. 任務排程器 (優先佇列模擬)


題目大意:

給定一定數量的不同執行次數的任務, 相同任務執行完後會有 n 個時間的冷卻時間。

求最少執行完任務的時間。


構造

最後得到的公式(冷卻時間大於任務數量時): ( m a x E x c u − 1 ) ∗ ( n + 1 ) + m a x C o u n t (maxExcu - 1) * (n + 1) + maxCount (maxExcu1)(n+1)+maxCount


冷卻時間少於任務數量的時候: len(tasks)


所以最後就是兩者取最大值.

在這裡插入圖片描述

在這裡插入圖片描述

( m a x E x c u − 1 ) ∗ ( n + 1 ) (maxExcu - 1) * (n + 1) (maxExcu1)(n+1) 每個填入, 週期大於任務數量的時候,每次填入一個需要這麼多的時間。直到填完最多的執行次數的任務。


處理最後一行

+ m a x C o u n t +maxCount +maxCount 是最後填入週期 n + 1 的空格時, 最後剩下的就是填入這 maxCount 個數


根據理解

公式就可以換為

計算上最多執行次數的的任務與週期的需要的完成時間 (最後一行算多了 >> 不一定需要 n + 1 的時間 >> 最後一行只要最多執行次數的任務的數量即可 maxCount )

所以減去多加的 ( n + 1 − m a x C o u n t ) (n + 1 - maxCount) (n+1maxCount)

( m a x E x c u ) ∗ ( n + 1 ) ) − ( n + 1 − m a x C o u n t ) (maxExcu)*(n+1)) - (n + 1 - maxCount) (maxExcu)(n+1))(n+1maxCount)


構造

func leastInterval(tasks []byte, n int) int {
	cnt := map[byte]int{}

	for _, c := range tasks{
		cnt[c]++;
	}
	// maxExcu 最多的執行次數
	// maxCount 與最多執行次數相同的任務數量
	maxExcu, maxCount := 0, 0
	for _, val := range cnt {
		if val > maxExcu{
			maxExcu, maxCount = val, 1
		} else if val == maxExcu{
			maxCount++
		}
	}
	
	return int(math.Max(float64(((maxExcu-1)*(n+1))+maxCount), float64(len(tasks))))
	
	//return int(math.Max(float64(((maxExcu)*(n+1)) - (n + 1 - maxCount)), float64(len(tasks))))
}



LeetCode構造題解: 任務排程器

相關文章