方法一:贪心算法

解题思路:

使用贪心的思想,先把出现最多的任务分配了(即每隔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++实现相关推荐

  1. LeetCode 621. 任务调度器(贪心)

    1. 题目 给定一个用字符数组表示的 CPU 需要执行的任务列表.其中包含使用大写的 A - Z 字母表示的26 种不同种类的任务.任务可以以任意顺序执行,并且每个任务都可以在 1 个单位时间内执行完 ...

  2. leetcode 621. 任务调度器(贪心算法)

    给你一个用字符数组 tasks 表示的 CPU 需要执行的任务列表.其中每个字母表示一种不同种类的任务.任务可以以任意顺序执行,并且每个任务都可以在 1 个单位时间内执行完.在任何一个单位时间,CPU ...

  3. leetcode - 621. 任务调度器

    给定一个用字符数组表示的 CPU 需要执行的任务列表.其中包含使用大写的 A - Z 字母表示的26 种不同种类的任务.任务可以以任意顺序执行,并且每个任务都可以在 1 个单位时间内执行完.CPU 在 ...

  4. LeetCode 热题 HOT 100 -------31. 下一个排列(数组,数学问题)128. 最长连续序列(数组) 11. 盛最多水的容器(数组) 621. 任务调度器 (数组)

    dsadas /**思路:找下一个排列,并且尽可能小,所以我们应该找一序列中从左边开始的"较小值"与"较大值"交换,但是为了尽可能小应该满足: 1." ...

  5. Leetcode 344. 反转字符串 解题思路及C++实现

    解题思路: 直接将第 i 个字符 与 第 n-1-i 个字符交换,就可以了. class Solution { public:void reverseString(vector<char> ...

  6. Leetcode 223. 矩形面积 解题思路及C++实现

    解题思路: 着重研究一下矩形四个顶点坐标的大小关系. if 条件语句中判断是否出现不重叠的情况. 当出现重叠时,需要找出重叠矩形的四个顶点坐标:在小的横坐标中找出更大者,就是重叠矩形中较大的横坐标值 ...

  7. Leetcode 206. 反转链表 解题思路及C++实现

    解题思路: 利用三个指针 left.right.tmp.left指向的是每一步反转之后的头结点,right指向的是当前需要反转的节点,tmp指向的是下一步需要反转的节点. /*** Definitio ...

  8. Leetcode 160. 相交链表 解题思路及C++实现

    解题思路: 先将两个链表构建成一个环,定义两个快慢指针,当它们相遇时,将fast指针从头结点往后遍历,每次走一步,当这两个指针再次相遇时,该节点就是相交节点. /*** Definition for ...

  9. Leetcode 141. 环形链表 解题思路及C++实现

    解题思路: 定义快慢两个指针,当指针所指节点是同一个时,说明出现了环. /*** Definition for singly-linked list.* struct ListNode {* int ...

最新文章

  1. 引用 提高开发水平的几项必备技术
  2. utf8 and unicode
  3. 独立主题需要有index.php模板文件,wordpress 主题模板文件列表及其作用
  4. JS设计模式——10.门面模式
  5. 高品质平板电脑模型为您的作品演示加分
  6. OpenShift 4 - 对镜像进行合规扫描,加固应用镜像安全
  7. vue-cli入门(四)——vue-resource登录注册实例
  8. Android设计模式之单例模式
  9. 【数字信号调制】基于matlab多进制数字频率调制(4FSK)【含Matlab源码 999期】
  10. 操作系统实验报告 lab1
  11. java中的打印pdf_Java 打印PDF文档
  12. java爬虫(爬取豆瓣电影排行榜)
  13. 使用node爬取小说内容并保存到本地
  14. 标识(志)符的概念与规则
  15. 【服务器数据恢复】nas存储服务器的数据恢复案例
  16. 12.5米分辨率DEM
  17. Hacker Fest: 2019-Walkthrough【VulnHub靶场】渗透测试实战系列3
  18. MCP2517FD应用总结
  19. 16.体测成绩判定(c函数调用)
  20. STM32的完整启动流程分析-----在外存flash中运行代码

热门文章

  1. python使用redis队列_Python的Flask框架应用调用Redis队列数据的方法
  2. python进度条 pyqt_Python高级进阶#015 pyqt5进度条QProgressBar结合使用qbasictimer
  3. linux进程假死的原因_一次Spring Boot假死诊断
  4. 著名站点的爬虫 —— 豆瓣
  5. *1408素数回文数的个数
  6. 各种 分页存储过程整理
  7. 常见java考试题与面试题一
  8. xheditor开源编辑器ajax上传功能的完善
  9. 高通 MSM8K bootloader 之三: LK
  10. Android 5.0 SEAndroid下如何获得对一个内核节点的访问权限