活跃农民
- 积分
- 356
- 大米
- 颗
- 鳄梨
- 个
- 水井
- 尺
- 蓝莓
- 颗
- 萝卜
- 根
- 小米
- 粒
- 学分
- 个
- 注册时间
- 2019-7-16
- 最后登录
- 1970-1-1
|
注册一亩三分地论坛,查看更多干货!
您需要 登录 才可以下载或查看附件。没有帐号?注册账号 
x
本帖最后由 Musclekai 于 2020-9-18 14:53 编辑
按道理pq只能保证peek是最大/最小,其他都是无序。而且poll()完queue顺序会发生变化。
可是为什么下面这个解法的pq能一直保持poll的都是最大/最小值啊?lc621
- class Solution {
- public int leastInterval(char[] tasks, int n) {
- int intervalCount = 0;
- Map<Character, Integer> taskFrequencyMap = new HashMap<>();
- for (char chr : tasks)
- taskFrequencyMap.put(chr, taskFrequencyMap.getOrDefault(chr, 0) + 1);
- PriorityQueue<Map.Entry<Character, Integer>> maxHeap = new PriorityQueue<Map.Entry<Character, Integer>>(
- (e1, e2) -> e2.getValue() - e1.getValue());
- // add all tasks to the max heap
- maxHeap.addAll(taskFrequencyMap.entrySet());
- while (!maxHeap.isEmpty()) {
- List<Map.Entry<Character, Integer>> waitList = new ArrayList<>();
- int k = n + 1; // try to execute as many as 'k+1' tasks from the max-heap
- for (; k > 0 && !maxHeap.isEmpty(); k--) {
- intervalCount++;
- Map.Entry<Character, Integer> currentEntry = maxHeap.poll();
- if (currentEntry.getValue() > 1) {
- currentEntry.setValue(currentEntry.getValue() - 1);
- waitList.add(currentEntry);
- }
- }
- maxHeap.addAll(waitList); // put all the waiting list back on the heap
- if (!maxHeap.isEmpty())
- intervalCount += k; // we'll be having 'n' idle intervals for the next iteration
- }
- return intervalCount;
- }
- }
复制代码
|
上一篇: 上完61b和cs170之后并不能帮助多少leetcode...下一篇: 分享一下5月份面试国内几家大公司的面试题,有找国内工作的同学可以参考下
|