【力扣·每日一题】630. 课程表 III (C++ 贪心 优先队列)

linkkk

题意

【力扣·每日一题】630. 课程表 III (C++ 贪心 优先队列)_第1张图片

思路

经典贪心(不是
首先,结束时间晚的可以后选,因为他的可选性比较高。所以首先按照结束时间从小到大排序。
然后遍历一遍序列,记录当前的时间。对于当前遍历到的课程,分类讨论:

  • 如果当前的时间加上当前课程所需要的时间 < = <= <=该课程的最晚结束时间,说明可以选该课程。
  • 如果此时无法选择该课程,可以将以前所选的需要时间最大的课程取消,用该课程替代。这样当前花费的时间会更少,而且课程数量还不变,更有利于最优解,这只是感性理解,具体证明见官方题解~

要动态的维护课程需要时间的最大值,用优先队列就可以了。

代码

class Solution {
public:
    static bool cmp(vector<int> &a,vector<int> &b){
        if(a[1]==b[1]){
            return a[0]<b[0];
        }
        return a[1]<b[1];
    }
    int scheduleCourse(vector<vector<int>>& courses) {
        sort(courses.begin(),courses.end(),cmp);
        priority_queue<int>q;
        int ans=0,now=0;
        for(vector<int>t:courses){
            if(now+t[0]<=t[1]){
                now+=t[0];
                q.push(t[0]);
            }
            else{
                if(!q.empty()){
                    if(q.top()>t[0]){
                        now=now-q.top()+t[0];
                        q.pop();
                        q.push(t[0]);
                    }
                }
            }
        }
        return q.size();
    }
};
/*
[[1,2],[2,3]]
*/

你可能感兴趣的:(力扣,leetcode,c++,贪心算法)