Leetcode 621. 任务调度器 解题思路及C++实现
生活随笔
收集整理的這篇文章主要介紹了
Leetcode 621. 任务调度器 解题思路及C++实现
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
方法一:貪心算法
解題思路:
使用貪心的思想,先把出現最多的任務分配了(即每隔n個單位時間分配一個任務),然后再把其它任務填上。如下圖
所以需要先計算各任務出現的次數,找到出現最多的任務,程序中使用map來計數,然后復制到vector,再通過自定義的比較函數cmp,對vector進行排序。
結果的計算公式為:(x - 1) * (n + 1) + num
其中,x表示出現次數最多的任務的次數,n表示輸入參數中的時間間隔,num表示出現次數為 x 的任務總數。
有一種特殊情況需要考慮,那就是:num的值要大于 n?的時候,例子如下:
輸入:["A", "A","A","B","B","B","C","C","C","D","D","D"], n = 2
按照公式(x - 1) * (n + 1) + num,結果為 2 * 3?+ 4 = 10,比tasks的size 12 還小,顯然不對。這種時候,就應該返回tasks的size大小。
?
class Solution { public://自定義比較函數,必須在前面加上 static,不然會報錯static bool cmp(const pair<char, int> &v1, const pair<char, int> &v2){return v1.second > v2.second;}int leastInterval(vector<char>& tasks, int n) {map<char, int> mp;//先將tasks中任務計數在map中for(int i = 0; i < tasks.size(); i++){map<char, int>::iterator it;it = mp.find(tasks[i]);if(it == mp.end()) mp[tasks[i]] = 1;else mp[tasks[i]]++;}//將map中的元素轉到vector中,之后再進行sort排序,找到出現次數最多的任務vector<pair<char, int> > count;for(map<char, int>::iterator iter = mp.begin(); iter != mp.end(); iter++){count.push_back(make_pair(iter->first, iter->second));}sort(count.begin(), count.end(), cmp);int num = 0; //用于記錄出現次數最多的任務有多少個for(int i = 0; i < count.size(); i++){if(count[i].second == count[0].second) num++;else break;}//出現次數最多的任務為count[0].first, 其出現次數是count[0].secondint res = (count[0].second - 1) * (n + 1) + num;if(res < tasks.size()) return tasks.size();else return res;}};?
其實,更簡單的方法可以直接就不需要map,只用一個包含26個元素(對應26個字母)的vector計數,就能解答這道題目。
?
總結
以上是生活随笔為你收集整理的Leetcode 621. 任务调度器 解题思路及C++实现的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Leetcode 319. 灯泡开关 解
- 下一篇: Leetcode 622. 设计循环队列