Leetocode之Task Scheduler 问题
2017-09-24 16:20
316 查看
问题描述:
Given a char array representing tasks CPU need to do. It contains capital letters A to Z where different letters represent different tasks.Tasks could be done without original order. Each task could be done in one interval. For each interval, CPU could finish
one task or just be idle.
However, there is a non-negative cooling interval n that means between two same tasks, there must be at least n intervals that CPU are doing different tasks or just be idle.
You need to return the least number of intervals the CPU will take to finish all the given tasks.
Note:
The number of tasks is in the range [1, 10000].
The integer n is in the range [0, 100].
示例:
Input: tasks = ['A','A','A','B','B','B'], n = 2
Output: 8
Explanation: A -> B -> idle -> A -> B -> idle -> A -> B.
思路分析:先介绍下题目的意思,然后我们在举几个例子,最后总结下规律给出代码。
题目意思:
数组中的字母表示的是CPU要执行的任务,相同的字母表示相同的任务,但是相同的任务之间必须间隔n个位置(interval,OS中翻译成时间片好像更准确一些吧),每个位置要么是CPU执行一个任务,要么就是idle,其中任务的完成顺序可以不是题目中数组的给定顺序。最后求的是CPU完成这些任务至少需要需要多少个位置(interval)。
案例分析:
例子一:上面的AAABBB,n = 2,我们可以这么构造,先找出数组中字母最多的字母,先让它站好坑,由于n=2,所以相同任务至少间隔2,在这AB是同样多的,所以构造的时候将它两绑定在一块成AB _ AB _AB,没有其他字母了,所以剩下两个空位填上idle,最终的长度是8 = (3 - 1) * (2 + 1) + 2;
例子二:比如AACCCDDEEE,n = 3,最多的是C,所以我们可以C_ _ _ C_ _ _ C_ _ _,接着放第二多的E,可以是CE_ _ CE_ _ CE _ _,接着放A,就是CEA_CEA_CE_ _,接着就是放D了,得到最后结果CEADCEADCE(当然不是唯一结果),但是长度是唯一的,长度 = tasks.length = 10.
规律总结:
我们可以先申请一个长度为26的数组,用来统计每个字母出现的次数,接着对数组进行排序,找到出现次数最多的字母,所以出现最多的字母一定是出现在了统计数组的最后,它出现的次数记为maxCount;另外,我们先考虑前面的每一块,后面剩下的先不说了,即例子一的AB_这一部分,每一块的长度为1 + n,为什么是n + 1呢?1代表着这个数本身,接着至少间隔n个元素才能出现该元素,加一块就是n + 1了;每一块共出现了maxCount - 1次(还剩一次出现在尾巴),所以就是(maxCount - 1)
* (n + 1);接着我们计算尾巴的长度,我们可以启动一个遍历过程,在计数数组中从后往前找,找到第一个不等于最大次数maxCount的位置,尾巴长都不就是25 - i了吗?所以,总共长度len就是(maxCount - 1) * (n + 1) + (25 - i)。当然还有可能是数组长度就够了,就能安排好每个任务了,所以结果是max(tasks.length, len)了。
代码:
Given a char array representing tasks CPU need to do. It contains capital letters A to Z where different letters represent different tasks.Tasks could be done without original order. Each task could be done in one interval. For each interval, CPU could finish
one task or just be idle.
However, there is a non-negative cooling interval n that means between two same tasks, there must be at least n intervals that CPU are doing different tasks or just be idle.
You need to return the least number of intervals the CPU will take to finish all the given tasks.
Note:
The number of tasks is in the range [1, 10000].
The integer n is in the range [0, 100].
示例:
Input: tasks = ['A','A','A','B','B','B'], n = 2
Output: 8
Explanation: A -> B -> idle -> A -> B -> idle -> A -> B.
思路分析:先介绍下题目的意思,然后我们在举几个例子,最后总结下规律给出代码。
题目意思:
数组中的字母表示的是CPU要执行的任务,相同的字母表示相同的任务,但是相同的任务之间必须间隔n个位置(interval,OS中翻译成时间片好像更准确一些吧),每个位置要么是CPU执行一个任务,要么就是idle,其中任务的完成顺序可以不是题目中数组的给定顺序。最后求的是CPU完成这些任务至少需要需要多少个位置(interval)。
案例分析:
例子一:上面的AAABBB,n = 2,我们可以这么构造,先找出数组中字母最多的字母,先让它站好坑,由于n=2,所以相同任务至少间隔2,在这AB是同样多的,所以构造的时候将它两绑定在一块成AB _ AB _AB,没有其他字母了,所以剩下两个空位填上idle,最终的长度是8 = (3 - 1) * (2 + 1) + 2;
例子二:比如AACCCDDEEE,n = 3,最多的是C,所以我们可以C_ _ _ C_ _ _ C_ _ _,接着放第二多的E,可以是CE_ _ CE_ _ CE _ _,接着放A,就是CEA_CEA_CE_ _,接着就是放D了,得到最后结果CEADCEADCE(当然不是唯一结果),但是长度是唯一的,长度 = tasks.length = 10.
规律总结:
我们可以先申请一个长度为26的数组,用来统计每个字母出现的次数,接着对数组进行排序,找到出现次数最多的字母,所以出现最多的字母一定是出现在了统计数组的最后,它出现的次数记为maxCount;另外,我们先考虑前面的每一块,后面剩下的先不说了,即例子一的AB_这一部分,每一块的长度为1 + n,为什么是n + 1呢?1代表着这个数本身,接着至少间隔n个元素才能出现该元素,加一块就是n + 1了;每一块共出现了maxCount - 1次(还剩一次出现在尾巴),所以就是(maxCount - 1)
* (n + 1);接着我们计算尾巴的长度,我们可以启动一个遍历过程,在计数数组中从后往前找,找到第一个不等于最大次数maxCount的位置,尾巴长都不就是25 - i了吗?所以,总共长度len就是(maxCount - 1) * (n + 1) + (25 - i)。当然还有可能是数组长度就够了,就能安排好每个任务了,所以结果是max(tasks.length, len)了。
代码:
相关文章推荐
- ActivityManager: Warning: Activity not started, its current task has been brought to the front 的的问题
- Failed to read schema document 'http://code.alibabatech.com/schema/dubbo/dubbo.xsd'问题解决方法
- Failed to read schema document 'http://code.alibabatech.com/schema/dubbo/dubbo.xsd'问题解决方法
- shapefile 编码错误问题解决 Wrong codepage of shapefile Warning 1: One or several characters couldn't be converted correctly from UTF-8 to ISO-8859-1.
- ActivityManager: Warning: Activity not started, its current task has been brought to the front 的的问题
- Ant Problem: failed to create task or type foreach 问题
- 发布应用到App Store问题:The CodeResources file is missing and it must be a symbolic link to _CodeSignature
- leecode 解题总结:123. Best Time to Buy and Sell Stock III
- Error: Execution failed for task ':app:clean'. Unable to delete file问题解决
- This event supports the .NET Framework infrastructure and is not intended to be used directly from your code?继承自VScrollbar的自定义winform控件,某些事件不触发的问题(Winform控件开发学习)
- 安卓问题报告小记(一): Activity not started, its current task has been brought to the front
- Installshield 多语言安装包 和 安装序列号验证,及如何解决 Failed to set code page for Language 46 问题
- (记录学习android遇到的问题)Error:Execution failed for task ':app:packageDebug'. > Failed to create
- ActivityManager: Warning: Activity not started, its current task has been brought to the front 的的问题
- 问题处理记录: clang: error: linker command failed with exit code 1 (use -v to see invocation)
- 解决“linker command failed with exit code 1(use -v to see invocation)”的问题
- 使用GPS提示的问题是Call requires permission which may be rejected by user: code should explicitly check to s
- 安卓问题报告小记(一): Activity not started, its current task has been brought to the front
- clang: error: linker command failed with exit code 1 (use -v to see invocation)错误问题
- IOS如何解决烦人的“clang: error: linker command failed with exit code 1 (use -v to see invocation)”问题