package com.example.leetcode;
import java.util.*;
public class LC621 {
/**
* 给你一个用字符数组 tasks 表示的 CPU 需要执行的任务列表。其中每个字母表示一种不同种类的任务。任务可以以任意顺序执行,并且每个任务都可以在 1 个单位时间内执行完。在任何一个单位时间,CPU 可以完成一个任务,或者处于待命状态。
*
* 然而,两个 相同种类 的任务之间必须有长度为整数 n 的冷却时间,因此至少有连续 n 个单位时间内 CPU 在执行不同的任务,或者在待命状态。
*
* 你需要计算完成所有任务所需要的 最短时间 。
*
*
*
* 示例 1:
*
* 输入:tasks = ["A","A","A","B","B","B"], n = 2
* 输出:8
* 解释:A -> B -> (待命) -> A -> B -> (待命) -> A -> B
* 在本示例中,两个相同类型任务之间必须间隔长度为 n = 2 的冷却时间,而执行一个任务只需要一个单位时间,所以中间出现了(待命)状态。
* 示例 2:
*
* 输入:tasks = ["A","A","A","B","B","B"], n = 0
* 输出:6
* 解释:在这种情况下,任何大小为 6 的排列都可以满足要求,因为 n = 0
* ["A","A","A","B","B","B"]
* ["A","B","A","B","A","B"]
* ["B","B","B","A","A","A"]
* ...
* 诸如此类
* 示例 3:
*
* 输入:tasks = ["A","A","A","A","A","A","B","C","D","E","F","G"], n = 2
* 输出:16 [A,6] [B,1] [C,1] [D,1] [E,1] [F,1] [G,1]
* 解释:一种可能的解决方案是:
* A -> B -> C -> A -> D -> E -> A -> F -> G -> A -> (待命) -> (待命) -> A -> (待命) -> (待命) -> A
*
*/
class Pair{
public Character ch;
public Integer freq;
public Pair(Character ch, Integer freq){
this.ch = ch;
this.freq = freq;
}
}
// 贪心?
public int leastInterval(char[] tasks, int n) {
Map<Character, Integer> map = new HashMap<>();
int totalElems = 0;
int res = 0;
List<Character> resList = new ArrayList<>();
for(int i=0; i<tasks.length; i++){
map.put(tasks[i], map.getOrDefault(tasks[i], 0) + 1);
totalElems++;
}
//LinkedHashMap<Character, Boolean> LRUCache = new LinkedHashMap<>();
//LRUCache --
LinkedList<Character> curList = new LinkedList<>();
Set<Character> curSet = new HashSet<>();
List<Pair> list = new ArrayList<>();
for(Map.Entry<Character, Integer> entry: map.entrySet()){
Character ch = entry.getKey();
Integer freq = entry.getValue();
list.add(new Pair(ch, freq));
// 从大到小 排序
list.sort((o1, o2) -> o2.freq - o1.freq);
}
while(totalElems > 0){
// find one elem
boolean found = false;
for(int i=0; i<list.size(); i++){
Pair curPair = list.get(i);
if(!curSet.contains(curPair.ch) && curPair.freq > 0){
//add this to res
res++;
totalElems--;
found = true;
//update list
curPair.freq--;
list.sort((o1, o2) -> o2.freq - o1.freq);
//update set
if(curList.size() == n){
Character needToRemove = curList.removeFirst();
curSet.remove(needToRemove);
curSet.add(curPair.ch);
curList.add(curPair.ch);
} else if(curSet.size() < n){
curSet.add(curPair.ch);
curList.add(curPair.ch);
}
resList.add(curPair.ch);
break;
}
}
if(!found){
res++;
resList.add('*');
if(curList.size() == n){
Character needToRemove = curList.removeFirst();
curSet.remove(needToRemove);
curSet.add('*');
curList.add('*');
} else if(curSet.size() < n){
curSet.add('*');
curList.add('*');
}
}
}
//output result
for(Character ch: resList){
System.out.print(ch + " -> ");
}
System.out.println();
return res;
}
public static void main(String[] args) {
char[] tasks = {'A','A','A','A','A','A','B','C','D','E','F','G'};
LC621 instance = new LC621();
int res = instance.leastInterval(tasks, 2);
System.out.println(res);
}
}
没有合适的资源?快使用搜索试试~ 我知道了~
leetcode热题100java实现代码
共176个文件
class:75个
java:75个
xml:9个
需积分: 5 1 下载量 14 浏览量
2023-09-12
10:18:54
上传
评论
收藏 242KB ZIP 举报
温馨提示
leetcode热题100java实现代码
资源推荐
资源详情
资源评论
收起资源包目录
leetcode热题100java实现代码 (176个子文件)
LC621.class 5KB
LC399.class 5KB
LC301.class 4KB
LC049.class 4KB
LC139.class 3KB
LC017.class 3KB
LC297.class 3KB
LC056.class 3KB
LC207.class 3KB
LC406.class 3KB
LC416.class 3KB
LC946_2.class 3KB
LC039.class 3KB
LC347.class 3KB
LC023.class 3KB
LC438.class 2KB
LC946.class 2KB
LC394.class 2KB
LC647.class 2KB
LC448.class 2KB
LC739.class 2KB
LC008.class 2KB
LC031.class 2KB
LC200.class 2KB
PQTest.class 2KB
LC079.class 2KB
LC148.class 2KB
LC581.class 2KB
LC337.class 2KB
LC003.class 2KB
LC338.class 1KB
LC142.class 1KB
LC005.class 1KB
LC560.class 1KB
LC015.class 1KB
LC239.class 1KB
LC034.class 1KB
LC002.class 1KB
LC322.class 1KB
LC399$UnionFind.class 1KB
LC300.class 1KB
LC114.class 1KB
LC072.class 1KB
LC128.class 1KB
LC105.class 1KB
LC053.class 1KB
LC152.class 1KB
LC494.class 1KB
LC023$1.class 1KB
LC617.class 1KB
LC033.class 1KB
LC211.class 1KB
LC096.class 906B
LC064.class 902B
LC461.class 880B
LC347$Wrap.class 836B
LC543.class 831B
LC538.class 817B
LC019.class 807B
SBTest.class 780B
LC309.class 727B
LC621$Pair.class 702B
LC240.class 683B
TreeNode.class 681B
LC011.class 670B
LC062.class 652B
LC239$Element.class 635B
LC406$People.class 632B
LC200$Point.class 621B
LC056$Seg.class 621B
ListNode.class 607B
LC010.class 475B
LC494_2.class 454B
LC004.class 450B
LC312.class 411B
mvnw.cmd 7KB
.DS_Store 8KB
.DS_Store 6KB
.DS_Store 6KB
2022-10-31T20-00-55_123-jvmRun1.dump 2KB
.gitignore 395B
.gitignore 47B
maven-wrapper.jar 57KB
LC621.java 5KB
LC399.java 4KB
LC406.java 4KB
LC207.java 3KB
LC946_2.java 3KB
LC297.java 3KB
LC139.java 3KB
LC416.java 3KB
LC301.java 3KB
LC056.java 3KB
LC946.java 2KB
LC023.java 2KB
LC031.java 2KB
LC079.java 2KB
LC039.java 2KB
LC581.java 2KB
LC647.java 2KB
共 176 条
- 1
- 2
资源评论
liu316484231
- 粉丝: 0
- 资源: 2
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功