621. 任务调度器

98 阅读1分钟

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

然而,两个 相同种类 的任务之间必须有长度为整数 n 的冷却时间,因此至少有连续 n 个单位时间内 CPU 在执行不同的任务,或者在待命状态。

你需要计算完成所有任务所需要的 最短时间 。

if(n ===0 )return tasks.length ;
let static =new Array(26).fill(0),map ={} ;
// /* 统计 */
// for(const task of tasks){
//     map[task] = Number(map[task])+1
// }

for(const task of tasks){
    static[task.charCodeAt()-65]++
}

/* 排序 */
// for(const[key, val] of Object.entries(map)){
//     static[val] ?? (static[val]=[])
//     static[val].push(key);
// }
static.sort((a,b)=> a-b)
/* 找到最大频率的任务种数 */
let  m2= 0, max = static[25]
for(let  i= 25;i> 0;i-- ){

    if(static[i] === max){
        m2++
    }else{
        break
    }
}
console.log(m2, max)
  return Math.max(tasks.length, (max-1)*(n+1) + m2)

/*设最多的任务数为m
 如果(n+1)*m 小于 tasks.length,那么可以直接按n+1个任务一轮在前面的任务后面插入新的任务,做到没有空位
   大于的话说明有空位
   */
let m = static.length-1 ;
if((n+1)*m <= tasks.length){ return tasks.length}

/* 在前面 (n+1)*(m-1)+1 不够 m(n+1)多余  的情况下 判断最后剩余任务单独执行所需时间是否大于n     */
/* 必须有空位的情况 */
let left = -tasks.length + m*(n+1) ;
while(left){
    for(let i= m;i< m;i++){

    }
}

if((m-1)*(n+1)+1 > tasks.length){ return (m-1)*n }

};