「每日LeetCode」2023年3月6日

本文最后更新于:2023年3月19日 晚上

  1. 会议室、253. 会议室 2

252. 会议室

给定一个会议时间安排的数组,每个会议时间都会包括开始和结束的时间 [[s1,e1],[s2,e2],…] (si < ei),请你判断一个人是否能够参加这里面的全部会议。

示例 1:
输入: [[0,30],[5,10],[15,20]]
输出: false

示例 2:
输入: [[7,10],[2,4]]
输出: true

253. 会议室 2

给定一个会议时间安排的数组,每个会议时间都会包括开始和结束的时间 [[s1,e1],[s2,e2],…] (si < ei),
为避免会议冲突,同时要考虑充分利用会议室资源,请你计算至少需要多少间会议室,才能满足这些会议安排。

示例 1:
输入: [[0, 30],[5, 10],[15, 20]]
输出: 2

示例 2:
输入: [[7,10],[2,4]]
输出: 1

思路

  • 开始时间一样,先结束的在前;开始早的在前
  • 优先队列存储会议结束的时间,堆顶是结束时间早的
  • 下一个会议开始时间早于堆顶的房间结束时间,该会议新开一个 room,push 进队列
  • 最后返回队列的 size

解答

1
2
3
4
5
6
7
8
9
10
const canAttendMeetings = (meetings) => {
let prevTime;
meetings.sort((a, b) => a[0] - b[0]);
for (let i = 0; i < meetings.length; i++) {
const [startTime, endTime] = meetings[i];
if (prevTime && startTime < prevTime) return false;
prevTime = endTime;
}
return true;
};
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
const minMeetingRooms = (meetings) => {
const insert = (arr, target) => {
let i;
for (i = 0; i < arr.length; i++) {
const num = arr[i];
if (num <= target) {
break;
}
}
arr.splice(i, 0, target);
};

meetings.sort((a, b) => {
if (a[0] === b[0]) {
return a[1] - b[1];
}
return a[0] - b[0];
});
const heap = [meetings[0][1]];
for (let i = 1; i < meetings.length; i++) {
const [startTime, endTime] = meetings[i];
const top = heap[heap.length - 1];
if (top <= startTime) heap.pop();
insert(heap, endTime);
}
return heap.length;
};

本博客所有文章除特别声明外,均采用 CC BY-SA 4.0 协议 ,转载请注明出处!