题目
这里有 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(); } };