文章目录

  • 1. 题目
  • 2. 解题
    • 2.1 错误解
    • 2.2 超时解
    • 2.3 通过解
    • 2.4 大佬解

1. 题目

给你一个数组 events,其中 events[i] = [startDayi, endDayi] ,表示会议 i 开始于 startDayi ,结束于 endDayi

你可以在满足 startDayi <= d <= endDayi 中的任意一天 d 参加会议 i 。注意,一天只能参加一个会议。

请你返回你可以参加的 最大 会议数目。

示例1:
输入:events = [[1,2],[2,3],[3,4]]
输出:3
解释:你可以参加所有的三个会议。
安排会议的一种方案如上图。
第 1 天参加第一个会议。
第 2 天参加第二个会议。
第 3 天参加第三个会议。示例 2::
输入:events= [[1,2],[2,3],[3,4],[1,2]]
输出:4示例 3:
输入:events = [[1,4],[4,4],[2,2],[3,4],[1,1]]
输出:4示例 4:
输入:events = [[1,100000]]
输出:1示例 5:
输入:events = [[1,1],[1,2],[1,3],[1,4],[1,5],[1,6],[1,7]]
输出:7提示:
1 <= events.length <= 10^5
events[i].length == 2
1 <= events[i][0] <= events[i][1] <= 10^5

来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/maximum-number-of-events-that-can-be-attended
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

2. 解题

2.1 错误解

  • 先按会议的start排序,相同的话按照end排序
class Solution {//出错代码
public:int maxEvents(vector<vector<int>>& events) {sort(events.begin(), events.end(),[](const auto& a, const auto& b){if(a[0] == b[0])return a[1] < b[1];return a[0] < b[0];});int i, count = 0, attendTime = 0;for(i = 0; i < events.size(); ++i){if(attendTime < events[i][0]){attendTime = events[i][0];count++;}else if(attendTime < events[i][1]){attendTime = attendTime+1;count++;}}return count;}
};


根据出错的例子,可知上面算法有缺陷:
正确的应该是:

  • 对当前会议i,还需要往下找到jj 被包含在i的区间内
  • 如果attendTime与区间j有交点,优先先参加j

2.2 超时解

class Solution {//超时代码
public:int maxEvents(vector<vector<int>>& events) {sort(events.begin(), events.end(),[](vector<int>& a, vector<int>& b){if(a[0] == b[0])return a[1] < b[1];return a[0] < b[0];});int i, j, count = 0, attendTime = 0;for(i = 0; i < events.size(); ++i){if(attendTime < events[i][0]){attendTime = events[i][0];count++;attendTime++;}else if(attendTime <= events[i][1]){for(j = i+1; j < events.size() && events[i][1] <= events[j][1]; ++j);if(j < events.size() && attendTime >= events[j][0]){count++;events.erase(events.begin()+j);attendTime++;i--;continue;}count++;attendTime++;}}return count;}
};

不幸的是:最后一个例子超时

2.3 通过解

优化

  • attendTimeevents[j]没有交点时,提前break
class Solution {//通过代码
public:int maxEvents(vector<vector<int>>& events) {sort(events.begin(), events.end(),[](vector<int>& a, vector<int>& b){if(a[0] == b[0])return a[1] < b[1];return a[0] < b[0];});int i, j, count = 0, attendTime = 0;for(i = 0; i < events.size(); ++i){if(attendTime < events[i][0]){attendTime = events[i][0];count++;attendTime++;//下一个可参加的时间}else if(attendTime <= events[i][1])//参加时间在区间内{for(j = i+1; j < events.size() && events[i][1] <= events[j][1]; ++j){ //向下查找,被i包含的区间jif(attendTime < events[j][0])break;//如果与attendTime没有交点,后面都不可能有}if(j < events.size() && attendTime >= events[j][0]){  //如果有交点,优先参加jcount++;events.erase(events.begin()+j);//参加了,删除掉attendTime++;//下一个可能的参会时间点i--;//后面会i++,先--i,继续跳转到原来的i进行处理continue;}count++;//attendTime与j没有交点,参加会议 iattendTime++;//时间点往后挪一个}}return count;}
};

2.4 大佬解

大佬的思路

  • 按照会议startevents 升序排序
  • 按日期time进行扫描
  • time时开始的会议都加入到优先队列(队列存储的是会议结束end时间)
  • 优先队列(小顶堆)把结束日期早的先出队,参加该会议
  • time++,新的一天,先把优先队列里已经过期的会议删除
class Solution {public:int maxEvents(vector<vector<int>>& events) {sort(events.begin(), events.end());priority_queue<int,vector<int>, greater<int>> q;//小顶堆,结束时间早的,先出队int count = 0, i = 0, time = 0;while(i < events.size() || !q.empty()){time++;while(!q.empty() && q.top() < time)//结束时间过去了,该会议删除q.pop();while(i < events.size() && events[i][0] == time){q.push(events[i][1]);//time时间,会议i开始了,把他的结束时间push进去i++;}if(!q.empty()){count++;q.pop();//最早结束的先参加}}return count;}
};

LeetCode 1353. 最多可以参加的会议数目(排序+贪心,优先队列,难)相关推荐

  1. LeetCode 1751. 最多可以参加的会议数目 II(DP + 二分查找)

    文章目录 1. 题目 2. 解题 1. 题目 给你一个 events 数组,其中 events[i] = [startDayi, endDayi, valuei] ,表示第 i 个会议在 startD ...

  2. leetcode1353. 最多可以参加的会议数目(贪心算法)

    给你一个数组 events,其中 events[i] = [startDayi, endDayi] ,表示会议 i 开始于 startDayi ,结束于 endDayi . 你可以在满足 startD ...

  3. [leetcode] 5342. 最多可以参加的会议数目

    参考:https://leetcode-cn.com/problems/maximum-number-of-events-that-can-be-attended/solution/sao-miao- ...

  4. 最多可以参加的会议数目--贪心算法

    LeetCode 最多可以参加的会议数目 给你一个数组 event ,其中 events[i] = [startDayi, endDayi] ,表示会议 i 开始于 startDayi ,结束于 en ...

  5. Leetcode 1353:最多可以参加的会议数目(超详细的解法!!!)

    给你一个数组 events,其中 events[i] = [startDayi, endDayi] ,表示会议 i 开始于 startDayi ,结束于 endDayi . 你可以在满足 startD ...

  6. LeetCode 1520. 最多的不重叠子字符串(贪心)

    文章目录 1. 题目 2. 解题 1. 题目 给你一个只包含小写字母的字符串 s ,你需要找到 s 中最多数目的非空子字符串,满足如下条件: 这些字符串之间互不重叠,也就是说对于任意两个子字符串 s[ ...

  7. LeetCode 807. 保持城市天际线 / 630. 课程表 III(贪心+优先队列)/ 851. 喧闹和富有(拓扑排序)

    807. 保持城市天际线 2021.12.13 每日一题 题目描述 给你一座由 n x n 个街区组成的城市,每个街区都包含一座立方体建筑.给你一个下标从 0 开始的 n x n 整数矩阵 grid ...

  8. 力扣1705——吃苹果的最大数目(贪心+优先队列)

    思路 对于此类有deadline的问题,首先想到贪心,直到deadline之前再做,这样才能为其他尽可能留出时间,才能做得更多. 首先想到的是按deadline排序,然后依次倒序在deadline前吃 ...

  9. 参加技术会议的一些小窍门

    博客搬到了fresky.github.io - Dawei XU,请各位看官挪步.最新的一篇是:参加技术会议的一些小窍门. 转载于:https://www.cnblogs.com/fresky/p/6 ...

最新文章

  1. 倦怠和枯燥_启动倦怠
  2. IHttpModule
  3. 进阶学习(3.6) Prototype Pattern 原型模式
  4. zabbix-server 的安装-centos7
  5. Python 中的作用域
  6. Metasploit--后渗透(一些基本操作方法)
  7. Spring Cloud 5分钟搭建教程(附上一个分布式日志系统项目作为参考)
  8. php网页事件处理方法,PHP实现事件机制的方法
  9. 亟需为个人信息安全“保驾护航”
  10. 解决Windows10 ssh连接Linux服务器Unable to negotiate with xx.xx.xx.xx port xx: no matching key exchange meth
  11. 利用数据质量规则库推动数据质量管理
  12. ps命令-显示Linux进程信息
  13. python调用百度地图、通过经纬度定位_python调用百度地图API得到两地经纬度计算直线距离...
  14. 苏宁大数据怎么运营_苏宁大数据离线任务开发调度平台实践
  15. unity步步生花(触发类互动)
  16. 基本组件之botton
  17. “渴了么”软件详细说明书
  18. 四、项目计划(华为项目管理法-孙科炎读书摘要)
  19. 结构体与联合体概念引入
  20. Nvidia AGX Xavier MAX9286 GMSL 载板

热门文章

  1. tbase同步mysql_mysql主从同步
  2. click传值vue_对vue下点击事件传参和不传参的区别详解
  3. [WinForm] VS2010发布、打包安装程序(超全超详细)
  4. Linux文件属性2——使用stat函数获取文件属性
  5. 字符串处理问题[2]:将一个数字型…
  6. 用Python自动生成NBA巨星生涯数据曲线
  7. java基础之线程(1)
  8. SpringBoot 封装返回类以及session 添加获取
  9. [转载]我的WafBypass之道(upload篇)
  10. One year ago begininginginginging!