/** 621. 任务调度器
* @author 作者 Your-Name:
* @version 创建时间:2020年2月27日 下午8:09:58
* 给定一个用字符数组表示的 CPU 需要执行的任务列表。其中包含使用大写的 A - Z 字母表示的26 种不同种类的任务。任务可以以任意顺序执行,并且每个任务都可以在 1 个单位时间内执行完。CPU 在任何一个单位时间内都可以执行一个任务,或者在待命状态。
然而,两个相同种类的任务之间必须有长度为 n 的冷却时间,因此至少有连续 n 个单位时间内 CPU 在执行不同的任务,或者在待命状态。
你需要计算完成所有任务所需要的最短时间。
示例 1:
输入: tasks = ["A","A","A","B","B","B"], n = 2
输出: 8
执行顺序: A -> B -> (待命) -> A -> B -> (待命) -> A -> B.
*/
public class rewudiaoduqi {
public static void main(String[] args)
{
char[] tasks = {'A','A','A','B','B','B','C','C','D'};
int n=2;
System.out.print(leastInterval(tasks,n));
}
public static int leastInterval(char[] tasks, int n) {
int[] num = new int[26];
Map<Character,Integer> hsm = new HashMap<>();
for(char c:tasks)
{
hsm.put(c, hsm.getOrDefault(c, 0)+1);
}
int m=0;
for(int c:hsm.values())
{
num[m++] = c;
}
Arrays.sort(num);
int time=0;
while(num[25]>0)
{
int i=0;
while(i<=n)
{
if(num[25]==0)
break;
if(i<26&&num[25-i]>0)
{
num[25-i]--;
}
time++;
i++;
}
Arrays.sort(num);
}
return time;
}
}