Leetcode630. 课程表 III

Every day a Leetcode

题目来源:630. 课程表 III

解法1:反悔贪心

经验告诉我们,在准备期末考试的时候,先考的课程先准备。同理,lastDay 越早的课程,应当越早上完。但是,有的课程 duration 比较长,上完需要花很多时间,可能把这些时间花在其它课程,早就上完好几门课了。

看上去,找不到一个合适的贪心策略。别放弃!顺着这个思路,如果我们可以「反悔」呢?

按照 lastDay 从小到大排序,然后遍历数组 courses。比如先上完 duration=7 的课和 duration=10 的课,后面遍历到了 duration=4 的课,但受到 lastDay 的限制,无法上 duration=4 的课。此时,我们可以「撤销」前面 duration 最长的课,也就是 duration=10 的课,这样就可以上 duration=4 的课了!虽然能上完的课程数目没有变化,但是由于我们多出了 10−4=6 天时间,在后续的遍历中,更有机会上完更多的课程。

在上面的讨论中,我们需要维护一个数据结构,来帮助我们快速找到 duration 最长的课程。这可以用优先队列(大根堆)解决。

代码:

/** @lc app=leetcode.cn id=630 lang=cpp** [630] 课程表 III*/// @lc code=start
class Solution
{
public:int scheduleCourse(vector<vector<int>> &courses){// 大根堆priority_queue<int> pq;int day = 0; // 已消耗时间sort(courses.begin(), courses.end(), [](const auto &a, const auto &b){return a[1] < b[1]; // 按照 lastDay 从小到大排序});for (vector<int> &course : courses){int duration = course[0], lastDay = course[1];if (day + duration <= lastDay){// 没有超过 lastDay,直接学习day += duration;pq.push(duration);}// 该课程的时间比之前的最长时间要短else if (!pq.empty() && duration < pq.top()){// 反悔,撤销之前 duration 最长的课程,改为学习该课程// 节省出来的时间,能在后面上完更多的课程day -= pq.top();pq.pop();day += duration;pq.push(duration);}}return pq.size();}
};
// @lc code=end

结果:

在这里插入图片描述

复杂度分析:

时间复杂度:O(nlogn),其中 n 为数组 courses 的长度。排序需要 O(nlog⁡n) 的时间;遍历 courses\textit{courses}courses 时,每次操作堆都需要 O(log⁡n) 的时间。总的时间复杂度为 O(nlog⁡n)。

空间复杂度:O(n),其中 n 为数组 courses 的长度。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/505830.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Vue开发实例(四)Element-UI部分组件使用方法

Element-UI的使用 一、Icon图标的使用1、用 i 标签使用图标 二、用 el-button 使用图标1、使用type定义样式2、使用plain定义样式3、使用round定义样式4、使用circle定义样式5、带图标和文字的按钮6、按钮禁用7、文字按钮8、按钮组9、加载中 三、Link 文字链接1、基础用法2、禁…

Stable Diffusion WebUI API http://127.0.0.1:7860/docs空白

在尝试调用Stable Diffusion WebUI API的时候&#xff0c;打开http://127.0.0.1:7860/docs遇到了以下页面 网络诊断是这样的原因&#xff1a; 修bug&#xff0c;改来改去遇到了以下两种页面&#xff1a; 此时http://127.0.0.1:7860可以如下正常显示&#xff1a; 查资料的时候找…

基于springboot+vue的科研工作量管理系统

博主主页&#xff1a;猫头鹰源码 博主简介&#xff1a;Java领域优质创作者、CSDN博客专家、阿里云专家博主、公司架构师、全网粉丝5万、专注Java技术领域和毕业设计项目实战&#xff0c;欢迎高校老师\讲师\同行交流合作 ​主要内容&#xff1a;毕业设计(Javaweb项目|小程序|Pyt…

php儿童服装销售管理系统计算机毕业设计项目包运行调试

php mysql儿童服装销售网 功能&#xff1a;前台后台 前台&#xff1a; 1.服装资讯 文章标题列表 详情 2.服装选购中心 分页查看图文列表 详情 3.用户注册 登陆 退出 4.服装加入收藏 5.加入购物车 6.对服装进行评论 会员中心&#xff1a; 1.我的账户 查看 修改 2.我的收藏 查看 …

模型部署 - onnx 的导出和分析 -(1) - PyTorch 导出 ONNX - 学习记录

onnx 的导出和分析 一、PyTorch 导出 ONNX 的方法1.1、一个简单的例子 -- 将线性模型转成 onnx1.2、导出多个输出头的模型1.3、导出含有动态维度的模型 二、pytorch 导出 onnx 不成功的时候如何解决2.1、修改 opset 的版本2.2、替换 pytorch 中的算子组合2.3、在 pytorch 登记&…

查看php版本

查看PHP版本有多种方法&#xff0c;下面列出几种常见的&#xff1a; 命令行方式&#xff1a; 在命令行中输入以下命令以显示PHP的完整版本信息&#xff1a; php -v 如果系统中存在多个PHP版本&#xff0c;并且你想检查特定版本&#xff0c;可以指定该版本的路径执行相同命令。 …

Linux系统管理:虚拟机 Kali Linux 安装

目录 一、理论 1.Kali Linux 二、实验 1.虚拟机Kali Linux安装准备阶段 2.安装Kali Linux 2. Kali Linux 更换国内源 3. Kali Linux 设置固定IP 4. Kali Linux 开启SSH远程连接 5. MobaXterm远程连接 Kali Linux 三、问题 1.apt 命令 取代哪些 apt-get命令 一、理论…

使用Spark探索数据

需求分析 使用Spark来探索数据是一种高效处理大规模数据的方法&#xff0c;需要对数据进行加载、清洗和转换&#xff0c;选择合适的Spark组件进行数据处理和分析。需求分析包括确定数据分析的目的和问题、选择合适的Spark应用程序和算法、优化数据处理流程和性能、可视化和解释…

Mysql学习之MVCC解决读写问题

多版本并发控制 什么是MVCC MVCC &#xff08;Multiversion Concurrency Control&#xff09;多版本并发控制。顾名思义&#xff0c;MVCC是通过数据行的多个版本管理来实现数据库的并发控制。这项技术使得在InnoDB的事务隔离级别下执行一致性读操作有了保证。换言之&#xff0…

C++的内联函数

目录 前言 内联函数 为什么声明和定义分离 为什么声明和定义分离后不出错 为什么内联函数不支持声明和定义分离 为什么内联函数支持声明和定义不分离 坚持声明和定义不分离的解决方法 static修饰函数 inline修饰函数 结论 声明和定义不分离的应用场景 前言 在C语言…

二次元风格地址发布页源码

二次元风格地址发布页源码&#xff0c;源码由HTMLCSSJS组成&#xff0c;记事本打开源码文件可以进行内容文字之类的修改&#xff0c;双击html文件可以本地运行效果&#xff0c;也可以上传到服务器里面&#xff0c;重定向这个界面 下载地址 https://www.qqmu.com/2347.html

C3_W2_Collaborative_RecSys_Assignment_吴恩达_中英_Pytorch

Practice lab: Collaborative Filtering Recommender Systems(实践实验室:协同过滤推荐系统) In this exercise, you will implement collaborative filtering to build a recommender system for movies. 在本次实验中&#xff0c;你将实现协同过滤来构建一个电影推荐系统。 …