【刷题1】LeetCode 621. 任务调度器 java题解
程序员文章站
2022-03-04 21:10:10
...
题目
https://leetcode-cn.com/problems/task-scheduler/
方法一
分析
在桶中从左到右,从上到下摆放。max是同一任务重复出现的最大次数,maxCount是达到最大次数的种类数。
假设n=2
情况1:种类数<=n+1
假设有 5 个 A,5 个 B, 2 个 C
最短时间=(n+1)*(max-1)+maxCount
情况2:种类数>n+1
假设有 5 个 A,5 个 B, 3 个 C,2 个 D,2 个 E,2 个 F,1 个 G
最短时间=任务总数
代码
class Solution {
public int leastInterval(char[] tasks, int n) {
int[] count=new int[26];
int max=0;//出现最多的任务
for(char t:tasks){
count[t-'A']++;
max=Math.max(max,count[t-'A']);
}
int maxCount=0;//有几个出现最多的任务
for(int c:count){
if(c==max){
maxCount++;
}
}
return Math.max((n+1)*(max-1)+maxCount,tasks.length);
}
}
复杂度
时间复杂度:O(M),其中 M 是任务的总数。
空间复杂度:O(1)。
结果
方法二:排序
分析
我们规定 n + 1 个任务为一轮,这样的好处是同一轮中一个任务最多只能被安排一次。在每一轮中,我们将当前的任务按照它们剩余的次数降序排序,并选择剩余次数最多的 n + 1 个任务依次执行。
代码
class Solution {
public int leastInterval(char[] tasks, int n) {
int[] map=new int[26];
for(char t:tasks){
map[t-'A']++;
}
Arrays.sort(map);
int time=0;
while(map[25]>0){
int i=0;
while(i<=n){
if(map[25]==0){
break;
}
if(i<26&&map[25-i]>0){
map[25-i]--;
}
time++;
i++;
}
Arrays.sort(map);
}
return time;
}
}
复杂度
时间复杂度:O(time),由于我们给每个任务都安排了时间,因此时间复杂度和最终的答案成正比。
空间复杂度:O(1)。
方法三:用优先队列排序
上一篇: QT_Windows_命令行下编译,发布
下一篇: pandas 查找数据