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

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

linkkk

题意

20200401134307494.png

思路

经典贪心(不是

首先,结束时间晚的可以后选,因为他的可选性比较高。所以首先按照结束时间从小到大排序。

然后遍历一遍序列,记录当前的时间。对于当前遍历到的课程,分类讨论:


如果当前的时间加上当前课程所需要的时间< =该课程的最晚结束时间,说明可以选该课程。

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

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

代码

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]]
*/
目录
相关文章
|
10天前
|
算法 C++
【数据结构与算法】:关于时间复杂度与空间复杂度的计算(C/C++篇)——含Leetcode刷题-2
【数据结构与算法】:关于时间复杂度与空间复杂度的计算(C/C++篇)——含Leetcode刷题
|
10天前
|
算法 C++
【数据结构与算法】:关于时间复杂度与空间复杂度的计算(C/C++篇)——含Leetcode刷题-1
【数据结构与算法】:关于时间复杂度与空间复杂度的计算(C/C++篇)——含Leetcode刷题
|
27天前
|
算法 C语言 容器
从C语言到C++_25(树的十道OJ题)力扣:606+102+107+236+426+105+106+144+94+145(下)
从C语言到C++_25(树的十道OJ题)力扣:606+102+107+236+426+105+106+144+94+145
34 7
|
27天前
|
存储 算法 C语言
从C语言到C++_39(C++笔试面试题)next_permutation刷力扣
从C语言到C++_39(C++笔试面试题)next_permutation刷力扣
16 5
|
27天前
|
存储 C语言 容器
从C语言到C++_26(set+map+multiset+multimap)力扣692+349+牛客_单词识别(下)
从C语言到C++_26(set+map+multiset+multimap)力扣692+349+牛客_单词识别
25 1
|
27天前
|
存储 C语言 容器
从C语言到C++_26(set+map+multiset+multimap)力扣692+349+牛客_单词识别(中)
从C语言到C++_26(set+map+multiset+multimap)力扣692+349+牛客_单词识别
26 1
|
27天前
|
存储 自然语言处理 C语言
从C语言到C++_26(set+map+multiset+multimap)力扣692+349+牛客_单词识别(上)
从C语言到C++_26(set+map+multiset+multimap)力扣692+349+牛客_单词识别
31 1
|
27天前
|
C语言
从C语言到C++_25(树的十道OJ题)力扣:606+102+107+236+426+105+106+144+94+145(中)
从C语言到C++_25(树的十道OJ题)力扣:606+102+107+236+426+105+106+144+94+145
27 1
|
11天前
|
索引
【LeetCode刷题】二分查找:山脉数组的峰顶索引、寻找峰值
【LeetCode刷题】二分查找:山脉数组的峰顶索引、寻找峰值
|
11天前
|
算法
【LeetCode刷题】滑动窗口解决问题:串联所有单词的子串(困难)、最小覆盖子串(困难)
【LeetCode刷题】滑动窗口解决问题:串联所有单词的子串(困难)、最小覆盖子串(困难)