日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > c/c++ >内容正文

c/c++

Leetcode 621. 任务调度器 解题思路及C++实现

發布時間:2025/4/16 c/c++ 15 豆豆
生活随笔 收集整理的這篇文章主要介紹了 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++实现的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。