问题描述
给定一系列会议时间,判断一个会议室是否能够容纳所有会议。每个会议都有一个开始和结束时间。
输入: 一个二维数组 intervals
,其中 intervals[i] = [starti, endi]
表示第 i
个会议的开始和结束时间。
输出: 如果会议室可以容纳所有会议,返回 true
;否则返回 false
。
解法一
解题思路:
我们需要找出所有会议的重叠部分。如果存在重叠,则返回 false
。
- 首先,将所有会议按照开始时间进行排序。
- 然后,遍历排序后的会议,对于每个会议,检查其结束时间是否与前一个会议的结束时间重叠。
- 如果没有重叠,则更新当前会议的结束时间为最大结束时间。
- 如果存在重叠,则返回
false
。
/*
* @lc app=leetcode.cn id=253 lang=javascript
*
* [253] 会议室II
*/
// @lc code=start
function minMeetingRooms(intervals) {
if (intervals.length === 0) return false;
intervals.sort((a, b) => a[0] - b[0]);
let rooms = 1;
let maxRooms = 1;
let endTimes = [intervals[0][1]];
for (let i = 1; i < intervals.length; i++) {
if (intervals[i][0] < endTimes[0]) {
// 需要新的会议室
rooms++;
maxRooms = Math.max(maxRooms, rooms);
endTimes.unshift(intervals[i][1]);
} else {
// 找到结束时间最早的会议,更新结束时间
let index = findIndex(endTimes, intervals[i][0]);
endTimes[index] = Math.max(endTimes[index], intervals[i][1]);
}
}
return maxRooms <= intervals.length;
}
function findIndex(endTimes, startTime) {
for (let i = 0; i < endTimes.length; i++) {
if (endTimes[i] <= startTime) return i;
}
return -1;
}
// @lc code=end