LeetCode Task Scheduler

来源:互联网 发布:vb系列振动电机 编辑:程序博客网 时间:2024/06/07 00:44

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.

Example 1:

Input: tasks = ['A','A','A','B','B','B'], n = 2Output: 8Explanation: A -> B -> idle -> A -> B -> idle -> A -> B.

Note:

  1. The number of tasks is in the range [1, 10000].
  2. The integer n is in the range [0, 100].
题解:
此题给定一个字母的数组,其中,每个字母代表一项任务,例如A任务,B任务等。并且额外给定一个n值,代表每两个相同的任务执行的间隔为n个间隔,那么求执行完这一数组中的任务所需要的最少的时间。
此题一开始还是非常有难度的。后来看了网上的一些相关的博客,原来有一些巧妙的方法可以来完成此题,可以通过一些例子来完成相应的计算公式的推导。
首先计算这一串字符中,计算相关的出现字母最多的次数为x,那么相应的间隔就是 (x-1) *n,这是相应的间隔;如果有k个出现次数最多的字母,还需要加上(x-1) * n + k;同时还需要加上出现一个x,也就是在前面加上出现次数最多的字母。还需要考虑一种情况,如果出现最多次字母的个数小于间隔,那么长度就是原来字母数组的长度。
看一个例子:
现在有一个表示字母的字符串
AAACCCEEEFF,首先计算出出现次数最多的元素为A,C和E,并且出现最多的次数为3次。那么据此,需要在中间插入(3-1) * n个间隔,然后还需要加上出现次数最多的元素个数,并且再加上间隔中的出现次数最多的元素个数,所以由三部分组成;但是还需要和整个数组的长度进行比较,哪个更长取哪个。
如果n为3,则依次如下所示插入,将ACE作为一个整体插入:
ACE_ACE_ACE
然后再插入F
ACEFACEFACE,那么满足条件的最小的长度就为上述数组的长度。但是当间隔距离小于或等于出现最多个字母的次数时,输出的就是数组长度,否则按照前面介绍的规律来做。
public class leastInterval {public int leastInterval(char[] tasks,int n){int[] alpNum = new int[26];for(int i = 0; i < tasks.length; i++){alpNum[tasks[i] - 'A'] ++;}Arrays.sort(alpNum);int i , max = 0;for(i = 24; alpNum[i] == alpNum[i + 1]; i--)max ++;return Math.max((alpNum[25] - 1) * n + max + alpNum[25], tasks.length);}}
这题考虑的是对于复杂数字规律下的归纳能力,需要我们能够从中抽丝剥茧,挖出有用的信息,还是很有锻炼价值的。

原创粉丝点击