力扣刷题日记-253. 会议室 II

505 阅读1分钟

给你一个会议时间安排的数组 intervals ,每个会议时间都会包括开始和结束的时间 intervals[i] = [starti, endi] ,返回 所需会议室的最小数量 。

来源:力扣(LeetCode) 链接:leetcode.cn/problems/me… 著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

思路:

  • 1.同一时间如果有会议重叠,那么肯定是要开多个会议室的
  • 2.所以只要找到重叠的会议最多的时刻有多少个会议就知道需要至少多个会议室了
  • 3.假设我们默认会议开始就开启一个会议室useRoom++,但是这个会议的开始时间比上一个会议的结束时间大,不会发生重叠
  • 4.那么刚刚开启的会议室取消useRoom--
  • 5.最后useRoom的值就是重叠会议的数量,也就是至少需要的会议室数量

拓展:

这类模型的题还有很多

  • 比如上下车,车里至少要多少座位才能满足乘客的需要
  • 电影院开电影最少需要多少个座位能满足客流量
  • 一座桥最多能让多少人同时过桥
  • 等等,都是求重叠的时候的值来定为临界值
/**
 * @param {number[][]} intervals
 * @return {number}
 */
var minMeetingRooms = function(intervals) {
    if(!intervals || intervals.length == 0) return 0
    let start = [], end = [];
    for(let i = 0; i < intervals.length; i++) {
        start[i] = intervals[i][0]
        end[i] = intervals[i][1]
    }
    start.sort((a, b) => a - b)
    end.sort((a, b) => a - b)
    let useRoom = 0, startPointer = 0,endPointer = 0;
    while(startPointer < start.length){
        useRoom++ // 只要开会就打开一个会议室
        if(start[startPointer] >= end[endPointer]){
            useRoom--// 发现这场会议的开始时间大于上一场会的结束时间,刚刚打开的会议是关掉
            endPointer++
        }
        startPointer++
    }
    return useRoom
};