[路飞][LeetCode]1353. 最多可以参加的会议数目

93 阅读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

提示: ​​​​​​

  • 1 <= events.length <= 105
  • events[i].length == 2
  • 1 <= 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
};

如有任何问题或建议,欢迎留言讨论!