0%

我的日程安排表

题目

当 k 个日程安排有一些时间上的交叉时(例如 k 个日程安排都在同一时间内),就会产生 k 次预订。

给你一些日程安排 [start, end) ,请你在每个日程安排添加后,返回一个整数 k ,表示所有先前日程安排会产生的最大 k 次预订。

思路

插旗法:进入一个区间的时候将该点坐标对应的值+1,代表插上一面进入的🚩,离开时将该点坐标值-1,代表插上一面离开的🚩,在同一个点可以同时插进入的旗或离开的旗,因为这样并不形成区间重叠。

通过计数器cnt可以得到当前重叠次数,如果不能重叠则cnt>1就返回false(如我的日程安排表一),如果不能重叠三次就cnt>2再返回false(如我的日程安排表二),如果要求最大重叠次数就返回cnt最大值(如我的日程安排表三)。

代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
map<int, int> rec;
int book(int start, int end) {
rec[start] ++;
rec[end] --;
int ans = 0;
int cnt = 0;
for(auto &a: rec){
/*
if(cnt>1){
rec[start] --;
rec[end] ++;
return false;
}
*/
cnt += a.second;
ans = max(ans, cnt);
}
return ans;
}

Welcome to my other publishing channels