美文网首页
算法笔记之优先队列——课程表 III

算法笔记之优先队列——课程表 III

作者: 简单一点点 | 来源:发表于2021-12-14 10:33 被阅读0次

优先队列(堆)的经典应用,记录一下。

题目描述

LeetCode.630. 课程表 III

这里有 n 门不同的在线课程,按从 1 到 n 编号。给你一个数组 courses ,其中 courses[i] = [durationi, lastDayi] 表示第 i 门课将会 持续 上 durationi 天课,并且必须在不晚于 lastDayi 的时候完成。

你的学期从第 1 天开始。且不能同时修读两门及两门以上的课程。

返回你最多可以修读的课程数目。

解题思路

此题利用了贪心的思想,考虑两门课的场景,我们要先学哪一门呢?我们需要先学截至日期更近的那门课。

因此,我们可以将所有课程按截止时间排序,然后依次学习。但是,这样并不能保证我们前面遍历到的课程学习了,后面的课程就满足学习条件。

因为题目要求了返回能够学习的最大课程数目,所以,我们应该优先选择学习时长更短的课程。

因此,我们可以使用优先级队列(大根堆)来维护已经选择了的课程,当出现冲突的时候,我们比较堆顶元素与待选择元素的学习时长,选择时长更短的课程进行学习。

Java代码

class Solution {
    public int scheduleCourse(int[][] courses) {
        // 按截至时间排序
        Arrays.sort(courses, (a, b) -> (a[1] - b[1]));
        // 优先队列,大根堆,按时长排序,更长的在顶部
        PriorityQueue<int[]> pq = new PriorityQueue<>((a,b) -> (b[0] - a[0]));
        int time = 0;
        for(int[] course : courses) {
            if(time + course[0] > course[1]) {
                if(!pq.isEmpty()) {
                    // 取堆顶元素
                    int[] current = pq.peek();
                    // 贪心策略,去掉时长最大的
                    if(current[0] > course[0]) {
                        pq.poll();
                        pq.offer(course);
                        time = time - current[0] + course[0];
                    }
                }
            } else {
                pq.offer(course);
                time += course[0];
            }
        }
        return pq.size();
    }
}

相关文章

  • 算法笔记之优先队列——课程表 III

    优先队列(堆)的经典应用,记录一下。 题目描述 LeetCode.630. 课程表 III[https://lee...

  • 最大堆应用: 堆排序 --- Java版

    堆定义 生活中需要使用优先队列, 比如cpu调度算法,线程调度算法都需要把优先级高的任务装入一个优先队列Prior...

  • 如何在javascript中使用优先级队列

    摘要:学习优先级队列很重要,因为它被用于许多算法中,例如 Dijkstra 的最短路径算法使用优先级队列。 介绍先...

  • STL容器之优先级队列

    STL容器之优先级队列pritrity_queue 优先级队列   优先级队列是一个队列, 但是和队列不同的是, ...

  • 算法笔记-排序03:优先队列

    为什么需要优先队列 我们并不一是一直都需要所有的元素全部有序。很多情况下我们会选择收集一些元素,然后处理其中键最大...

  • 排序算法

    什么是算法 书籍推荐 《数据结构与算法分析》 表、栈和队列 树 散列(hash) 优先队列(堆) 排序 定义 问题...

  • 堆排序学习总结

    本文摘抄总结于《算法》 我们可以把任意优先队列变成一种排序方法。而优先队列有多种实现方式,如无序数组实现的最小优先...

  • 算法读书笔记-排序算法-优先队列

    优先队列是一种抽象数据类型,它表示了一组值和对这些值的操作,它可以让我们每次从中取出权重最大的值. 优先队列的实现...

  • 优先队列学习总结

    本文内容是《算法》书中内容的摘抄以及总结 重要概念 什么是优先队列?——优先队列是一个支持删除最大(最小)元素和插...

  • 算法通关 - 优先队列

    优先队列(PriorityQueue) 优先队列也是队列的一种,它的特点: 不像队列按照先进先出来的。优先队列是正...

网友评论

      本文标题:算法笔记之优先队列——课程表 III

      本文链接:https://www.haomeiwen.com/subject/ikuefrtx.html