leetcode-630:课程表 III

简介: leetcode-630:课程表 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

解题

使用优先级队列的题leetcode-347:前 K 个高频元素,这道题也使用了优先级队列

关于sort调用自定义函数用法

注意排序sort中,输入的自定义lambda函数 ,比如greater()是已经写好的函数,从大到小排序。

必须要加括号greater()

sort(s.begin(),s.end(),greater<int>());

关于priority_queue调用自定义函数用法

但是priority_queue中,输入是函数名,不再是方法

比如定义一个小顶堆

不能加括号greater

priority_queue<int,vector<int>,greater<int>>

因此可以使用定义一个仿函数

方法一:贪心+优先队列

参考链接

优先选择,截止日期近的。

优先选择,课程时间短的

1.如果可以添加新的课程total+course[0]<=course[1],那么就添加

2.如果不行,那么就看,新的课程是否时间更少course[0],如果更少则替换。(这样就可以使得总时间total更少,可以使得之后在步骤1添加更多课程)

写法一:

class Solution {
public:
    class mycomparsion{
        public:
            bool operator()(vector<int>& a,vector<int>& b){
                return a[0]<b[0];
            }
    };
    int scheduleCourse(vector<vector<int>>& courses) {
        sort(courses.begin(),courses.end(),[](vector<int>&a,vector<int>&b){//按照deadline从小到大排序
            return a[1]<b[1];
        }); 
        priority_queue<vector<int>,vector<vector<int>>,mycomparsion> maxheap;//定义大顶堆(持续时间长的放堆顶)
        int total=0;
        for(vector<int>& course:courses){
            if(total+course[0]<=course[1]){
                total+=course[0];
                maxheap.push(course);
            }
            else if(!maxheap.empty()&&course[0]<maxheap.top()[0]){
                total=total-maxheap.top()[0]+course[0];
                maxheap.pop();
                maxheap.push(course);
            }
        }
        return maxheap.size();
    }
};

写法二:

由于优先级队列中,只需要存 课程持续时间就行了,没必要存整个vector,这样写法更加简洁

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,vector<int>,less<int>> maxheap;
        int total=0;
        for(vector<int>& course:courses){
            if(total+course[0]<=course[1]){
                total+=course[0];
                maxheap.push(course[0]);
            }
            else if(!maxheap.empty()&&course[0]<maxheap.top()){
                total=total-maxheap.top()+course[0];
                maxheap.pop();
                maxheap.push(course[0]);
            }
        }
        return maxheap.size();
    }
};


相关文章
|
5月前
|
Go
golang力扣leetcode 207.课程表
golang力扣leetcode 207.课程表
69 0
|
5月前
|
人工智能 算法 BI
力扣1462.课程表
力扣1462.课程表
|
5月前
|
算法
力扣630.课程表
力扣630.课程表
|
5月前
|
人工智能 BI
leetcode-207:课程表
leetcode-207:课程表
44 0
|
5月前
|
存储 人工智能 BI
【力扣热题100】207. 课程表 python 拓扑排序
【力扣热题100】207. 课程表 python 拓扑排序
58 0
|
5月前
|
存储 人工智能 算法
☆打卡算法☆LeetCode 210. 课程表 II 算法解析
☆打卡算法☆LeetCode 210. 课程表 II 算法解析
|
5月前
|
存储 人工智能 算法
☆打卡算法☆LeetCode 207. 课程表 算法解析
☆打卡算法☆LeetCode 207. 课程表 算法解析
LeetCode-630 课程表Ⅲ
这里有 n 门不同的在线课程,按从 1 到 n 编号。给你一个数组 courses ,其中 courses[i] = [durationi, lastDayi] 表示第 i 门课将会 持续 上 durationi 天课,并且必须在不晚于 lastDayi 的时候完成。 你的学期从第 1 天开始。且不能同时修读两门及两门以上的课程。 返回你最多可以修读的课程数目。
|
人工智能 Java BI
力扣207:课程表(Java拓扑排序:bfs+dfs)
力扣207:课程表(Java拓扑排序:bfs+dfs)
128 0