看一百遍美女,美女也不一定是你的。但你刷一百遍算法,知识就是你的了~~
谁能九层台,不用累土起!
题目
给你一个数组 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
提示:
1 <= events.length <= 105events[i].length == 21 <= startDayi <= endDayi <= 105
解题思路
- 我们先将会议结束时间要从前往后进行排列,优先参加早结束的会议
- 先判断每个会议明显都可以参加的情况,返回所有会议数量
- 否则我们遍历所有的会议
- 从第
start天开始,对有空的会议进行统计 - 返回最后统计的结果
解题代码
var maxEvents = function(events) {
events.sort((a,b)=>a[1]-b[1])
let res = 0
const busy = []
let flag = true
for(let i =1;i<events.length;i++){
if(events[i-1][1]>=events[i][1]){
flag = false
break
}
}
if(flag) return events.length
for(let i=0;i<events.length;i++){
let [start,end] = events[i]
for(let j=start;j<=end;j++){
if(!busy[j]){
busy[j]=1
res++
break;
}
}
}
return res
};
如有任何问题或建议,欢迎留言讨论!