題目描述
給定一個char數組,表明CPU須要作的任務,包含A-Z,不用考慮順序,每一個任務能在1個單位完成。可是有規定一個非負整數n表明兩個相同任務之間須要至少n個時間單位。球最少數量的時間單位完成全部任務。java
思路
先要找到最大的任務個數x,若總任務類數>=n,則時間至少爲(x-1)*(n+1)+最大值類數;可是對於特殊狀況:4A3B3C3D,n=2,則使用原來的思路(先放最多類的,再按照類別從前日後填空) 不能得到最小值。因此沒有作出來。數組
Solution
總結了一下,LeetCode上的達人們的思路主要有這樣幾種:操作系統
- 先統計詞頻,再排序,從後往前找到第一個不是最大詞頻的下標i,結果是tasks.length或(c[25] - 1) * (n + 1) + 25 – i中大的那一個,25-i就是最大詞頻的任務類,這個和個人思路是同樣的。證實:最大詞頻是k,則建立k個塊,每一塊開頭是最大詞頻的任務構成的(輸入AACCCDDEEE,則開頭是CE),詞頻由大到小插入每一塊。97.69%,10ms。
- 貪心,利用優先隊列排序:隊列中保存<類型,個數>的map,而且按照個數由大到小排序。按照詞頻由大到小取出n+1個或者隊列中所有(若沒有取出所有,則總長度要加上空閒個數),再把詞頻-1以後不爲0的放回隊列中。直到隊列空了爲止。——其實也和前面相同,老是選擇詞頻最大的填入每一塊。
- 使用操做系統的思想,在時間爲time的時候,把time-1-n凍結的任務放回等待隊列waitingQueue,在一個循環結束的時候,若是還有這一類task待完成,放到tasksTable。具體作法:先用HashMap統計詞頻,再用優先隊列waitingQueue排序,聲明一個冷卻HashMap表coolDownTable,當隊列不空或者冷卻表不空的時候,找到冷卻表time-n-1對應的任務char,拿出放到等待隊列中,若是等待隊列不空{拿出任務,剩餘任務個數-1並放到tasksTable,若是剩餘任務個數不爲0放到coolDownTable.put(time, task); } time++。返回time
- 相似上面,模擬的思想:對於m個任務,先是每類任務的冷卻時間-1,而後找到詞頻最大的任務及其下標,若是它的詞頻>-1,則取這個任務(詞頻-1,處理++,冷卻時間+n);不然(全部任務詞頻都爲-1),空閒+1.返回處理+空閒時間
代碼
只是實現了第一個solution的代碼:code
public int leastInterval(char[] tasks, int n) {
int[] freq=new int[26];
int maxFreq=0,maxFreqCount=0;
for(int i=0;i<tasks.length;i++){
freq[tasks[i]-'A']++;
}
for(int i=0;i<26;i++){
if(freq[i]>maxFreq){
maxFreq=freq[i];
maxFreqCount=1;
}else if(freq[i]==maxFreq){
maxFreqCount++;
}
}
return Math.max(tasks.length,(maxFreq-1)*(n+1)+maxFreqCount);
}