• LeetCode 0630.课程表 III:贪心 + 优先队列


    【LetMeFly】630.课程表 III:贪心 + 优先队列

    力扣题目链接:https://leetcode.cn/problems/course-schedule-iii/

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

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

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

     

    示例 1:

    输入:courses = [[100, 200], [200, 1300], [1000, 1250], [2000, 3200]]
    输出:3
    解释:
    这里一共有 4 门课程,但是你最多可以修 3 门:
    首先,修第 1 门课,耗费 100 天,在第 100 天完成,在第 101 天开始下门课。
    第二,修第 3 门课,耗费 1000 天,在第 1100 天完成,在第 1101 天开始下门课程。
    第三,修第 2 门课,耗时 200 天,在第 1300 天完成。
    第 4 门课现在不能修,因为将会在第 3300 天完成它,这已经超出了关闭日期。

    示例 2:

    输入:courses = [[1,2]]
    输出:1
    

    示例 3:

    输入:courses = [[3,2],[4,3]]
    输出:0
    

     

    提示:

    • 1 <= courses.length <= 104
    • 1 <= durationi, lastDayi <= 104

    方法一:贪心 + 优先队列

    贪心是因为:两门课相比,能完成截止时间早的就完成截止时间早的

    就像期末考试优先复习先考的一样。

    但是如果截止时间早的课特别长呢(复习这门课的时间够学其他课两门了)?那么就「反悔」吧!

    先按照截止时间从小到大排序,遍历courses。如果上完了duration=10的课导致无法按时完成duration=4的课,那么就“撤回”时长为10的课转上时长为4的课(没有少上课,但完成时间提前了,多空出来了6天)。

    怎么实现呢?用优先队列(大根堆)来记录所有已选择的课的时长即可。

    也可以参考LeetCode@灵茶山艾府的题解

    • 时间复杂度 O ( n × log ⁡ n ) O(n\times \log n) O(n×logn),其中 n = l e n ( c o u r s e s ) n = len(courses) n=len(courses)
    • 空间复杂度 O ( n ) O(n) O(n)

    AC代码

    C++
    class Solution {
    public:
        int scheduleCourse(vector<vector<int>>& courses) {
            sort(courses.begin(), courses.end(), [](vector<int>& a, vector<int>& b) {
                return a[1] < b[1];
            });
            priority_queue<int> pq;
            int totalTime = 0;
            for (vector<int>& c : courses) {
                if (c[1] - c[0] >= totalTime) {
                    totalTime += c[0];
                    pq.push(c[0]);
                }
                else if (pq.size() && pq.top() > c[0]) {
                    totalTime = totalTime + c[0] - pq.top();
                    pq.pop();
                    pq.push(c[0]);
                }
            }
            return pq.size();
        }
    };
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    Python
    from typing import List
    import heapq
    
    class Solution:
        def scheduleCourse(self, courses: List[List[int]]) -> int:
            courses.sort(key=lambda a : a[1])
            pq = []
            totalTime = 0
            for duration, lastday in courses:
                if lastday - duration >= totalTime:
                    totalTime += duration
                    heapq.heappush(pq, -duration)
                elif pq and -pq[0] > duration:
                    totalTime = totalTime + duration -(-pq[0])
                    heapq.heapreplace(pq, -duration)
            return len(pq)
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16

    同步发文于CSDN,原创不易,转载经作者同意后请附上原文链接哦~
    Tisfy:https://letmefly.blog.csdn.net/article/details/132806660

  • 相关阅读:
    高质量实时渲染笔记
    ceph(一)
    第三十二节——组合式API计算属性+watch
    同花顺_代码解析_技术指标_S
    Android:使用Jetpack Compose画渐变背景
    C# --- WinForm基本知识与绘图(下)
    【模型推理加速系列】BERT加速方案对比 TorchScript vs. ONNX
    Leetcode1704:判断字符串的两半是否相似
    ASO优化之应用程序图标的设计技巧
    易周金融分析 | 互联网系小贷平台密集增资;上半年银行理财子公司综合评价指数发布
  • 原文地址:https://blog.csdn.net/Tisfy/article/details/132806660