LeetCode每日一题 630. 课程表 III

题目描述

给定一个二维数组 courses,其中每个元素 courses[i] 表示第 i 门课程的持续时间和截止日期,数组的第一列表示持续时间,第二列表示截止日期。你需要修完这些课程,但你每天只能学一门课程,且必须在截止日期前完成。

问:最多可以修多少门课程?

思路

这个问题可以使用贪心算法来解决,需要按照一定策略选择课程,以最大程度地完成课程数量。

首先,将课程按照截止日期升序排序,这样我们可以首先选择截止日期早的课程。

然后,使用一个最大堆(优先队列) courseQueue 来存储已选课程的持续时间。初始化当前时间 currentTime 为0。

接下来,遍历排序后的课程列表,对于每门课程:

  • 如果当前时间加上课程的持续时间不超过课程的截止日期,那么可以安排这门课程,将其持续时间加入 courseQueue 并更新当前时间。
  • 否则,如果课程持续时间小于 courseQueue 中的最长时间,就替换掉 courseQueue 中的最长时间课程,同时更新当前时间。

最后,返回 courseQueue 的大小,即为最多可以修的课程数量。

代码

class Solution {
public:
    int scheduleCourse(vector<vector<int>>& courses) {
        // 按照截止日期升序排序
        sort(courses.begin(), courses.end(), [](const vector<int>& a, const vector<int>& b) {
            return a[1] < b[1];
        });

        priority_queue<int> courseQueue; // 用于存储已选课程的持续时间(最大堆)
        int currentTime = 0; // 当前时间

        for (const vector<int>& course : courses) {
            int duration = course[0]; // 课程持续时间
            int deadline = course[1]; // 课程截止日期

            if (currentTime + duration <= deadline) {
                // 可以安排这门课程
                courseQueue.push(duration);
                currentTime += duration;
            } else if (!courseQueue.empty() && courseQueue.top() > duration) {
                // 如果当前课程持续时间比已选课程中的最长时间短,
                // 并且替换最长时间的课程可以安排当前课程,则替换最长时间的课程
                currentTime += duration - courseQueue.top();
                courseQueue.pop();
                courseQueue.push(duration);
            }
        }

        return courseQueue.size();
    }
};

  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值