題目連結:
題目意譯:
你被給定一個索引值從 0 開始的正整數陣列 tasks,代表著需要被依序完成的任務,其中 tasks[i] 代表著第 i 件任務的種類。
你同時也被給定一個正整數 space,其代表著在完成某個種類的任務之後要執行下一個同一種類的任務最少需要經過的天數。
直到所有任務都完成為止之前,每一天你都必須:
完成 tasks 中的下一個任務;
或是休息。
回傳完成所有任務最少所需的天數。
限制:
1 ≦ tasks.length ≦ 10 ^ 5
1 ≦ tasks[i] ≦ 10 ^ 9
1 ≦ space ≦ tasks.length
範例測資:
範例 1:
輸入: tasks = [1,2,1,2,3,1], space = 3
輸出: 9
解釋:
其中一種在 9 天內完成所有任務的方式如下:
第 1 天:完成第 0 個任務。
第 2 天:完成第 1 個任務。
第 3 天:休息。
第 4 天:休息。
第 5 天:完成第 2 個任務。
第 6 天:完成第 3 個任務。
第 7 天:休息。
第 8 天:完成第 4 個任務。
第 9 天:完成第 5 個任務。
可以證明這些任務無法在少於 9 天的情況下完成。
範例 2:
輸入: tasks = [5,8,8,5], space = 2
輸出: 6
解釋:
其中一種在 6 天內完成所有任務的方式如下:
第 1 天:完成第 0 個任務。
第 2 天:完成第 1 個任務。
第 3 天:休息。
第 4 天:休息。
第 5 天:完成第 2 個任務。
第 6 天:完成第 3 個任務。
可以證明這些任務無法在少於 6 天的情況下完成。
解題思維:
用一個雜湊表(Hash Table)H,來記錄每一種任務最晚到哪一天都還不能開始執行(最初一開始每一種任務 i 預設為 H[i] = 0,意即從第一天開始之後就都可以執行)。
接著定義一變數 D(一開始為 0),其代表著在看到目前的任務後最早完成的天數為何。然後我們掃過 tasks,對於每一個任務 tasks[i] 取
D + 1
和
H[tasks[i]] + 1
兩者的最大值,即可決定出下一個 D 值(因為要嘛你現在的天數已經超過 H[tasks[i]] 的執行天數限制,又或是你必須等到天數限制過了才能花一天完成該任務)。之後將 H[tasks[i]] 之值更新為 D + space,來表示下一次同一種任務必須至少在這個天數之後才能完成。
最後掃過所有任務後,當前的 D 值即為所求。
此次分享到此為止,如有任何更加簡潔的想法或是有說明不清楚之地方,也煩請各位大大撥冗討論。