贪心算法。按结课时间自定义排序,优先按结课时间早的上课。如果当前课程的花费时间+已经有的花费时间大于当前课的结束时间,那当前课程就不一定能上,需要二次判断当前课程的花费时间是否大于已经选择课程的最大花费时间。如果小于的话就可以上,并替换掉那个最大花费时间的课程,否则的话就不能上。返回最大堆的size即为answer。
需要记一下cpp里面的自定义排序,和最大堆的写法:
cpp自定义排序:
// 按结课时间自定义排序,#include<algorithm>
sort(begin(courses),end(courses),[](auto& a,auto& b){
return a[1]<b[1];
});
cpp最大堆:
#include<queue>
priority_queue<int,vector<int>,less<int>> pq; // 最大堆
code:
/*
* @lc app=leetcode.cn id=630 lang=cpp
*
* [630] 课程表 III
*/
#include<vector>
#include<algorithm>
#include<queue>
using namespace std;
// @lc code=start
class Solution {
public:
int scheduleCourse(vector<vector<int>>& courses) {
// 按结课时间自定义排序
sort(begin(courses),end(courses),[](auto& a,auto& b){
return a[1]<b[1];
});
int cost = 0;
priority_queue<int,vector<int>,less<int>> pq;
for(auto&& item:courses){
if (cost+item[0]<=item[1]){
pq.push(item[0]);
cost +=item[0];
}
else{
// cost+item[1] > item[1]
if (!pq.empty()&&item[0]<pq.top()){
cost -= pq.top();
pq.pop(); // 弹出最大值
cost +=item[0];
pq.push(item[0]);
}
}
}
return pq.size();
}
};
// @lc code=end