《LeetCode之每日一题》:235.课程表 III

Posted 是七喜呀!

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了《LeetCode之每日一题》:235.课程表 III相关的知识,希望对你有一定的参考价值。

课程表 III


题目链接: 课程表 III

有关题目

这里有 n 门不同的在线课程,按从 1 到 n 编号。
给你一个数组 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 <= 10^4
1 <= durationi, lastDayi <= 10^4

题解

法一:优先队列 + 贪心
参考官方题解

class Solution 
public:
    int scheduleCourse(vector<vector<int>>& courses) 

        //按照lastDay从小到大排序courses数组
        sort(courses.begin(), courses.end(), [](const auto& c0, const auto& c1)
            return c0[1] < c1[1];
        );

        priority_queue<int> q;//优先队列存放所有的可以修读的科目

        //统计优先队列中的所有总时间
        int total = 0;

        for (auto &c : courses)
        
            int d1 = c[0], l1 = c[1];
            if (total + d1 <= l1)//即将添加的课程d1持续的时间 与 总时间之和 小于等于 截止日期
            
                total += d1;
                q.push(d1);
            

            //当前课程 需要持续的时间小于优先队列(大根堆)队头元素
            //我们贪心的将其替换为 d1,这样就可以减少total的上限,增加了可以选择其他科目的可能性
            else if (!q.empty() && q.top() > d1)
            
                total -= q.top() - d1;
                q.pop();
                q.push(d1);
            
        

        return q.size();
    
;

以上是关于《LeetCode之每日一题》:235.课程表 III的主要内容,如果未能解决你的问题,请参考以下文章

《LeetCode之每日一题》:62.山脉数组的峰顶索引

《LeetCode之每日一题》:57.完全平方数

《LeetCode之每日一题》:220.随机翻转矩阵

《LeetCode之每日一题》:135.按权重随机选择

《LeetCode之每日一题》:21.删除并获得点数

《LeetCode之每日一题》:55.盈利计划