/**
* 输入:tasks = ["A","A","A","B","B","B"], n = 2
输出:8
解释:A -> B -> (待命) -> A -> B -> (待命) -> A -> B.
在本示例中,两个相同类型任务之间必须间隔长度为 n = 2 的冷却时间,而执行一个任务只需要一个单位时间,所以中间出现了(待命)状态。
*/
//思路:将整个时间划成一个个区间,n个间隔时间,则一个区间的长度为n+1,一次填充一个区间,每次数量最多的字母优先填充
//最后一次因为后面没有字母了,所以填充完后不需要添加待命的时间,填充的次数等于整个的时间
public function leastInterval($tasks, $n) {
$data = [];
//计算每个字母的数量
foreach($tasks as $v){
$data[$v] = isset($data[$v])?$data[$v]+1:1;
}
$num = 0;
while(!empty($data)){
//按数量排序
arsort($data);
//间隔n个,一个区间就是n+1个
$count = $n+1;
//填充区间
while($count){
//数量多的先填充
foreach($data as $k=>$v){
//填充一个数量减1
$data[$k]--;
//时间加1
$num++;
//需要填充的数量减1
$count--;
//当字母数量为0,剔除这个字母
if($data[$k] == 0) unset($data[$k]);
//填充完一个退出
if($count == 0) break;
}
//判断字母是否都填充完
if(!empty($data)){
//没填充完的区间填充空(即待命),时间加上待命的时间
$num += $count;
}
//区间都填充完,将需要填充的数量置0
$count = 0;
}
}
return $num;
}