转载做题方法!
今天介绍的方法叫插旗法,其实我最早是在253. 会议室Ⅱ中介绍过,但是由于很多同学不是会员,刚好今天又看到这种类型的题,所以想着再次介绍一下。
先来介绍一下插旗法:进入一个区间的时候将该点坐标对应的值+1,代表插上一面进入的🚩,离开时将该点坐标值-1,代表插上一面离开的🚩,在同一个点可以同时插进入的旗或离开的旗,因为这样并不形成区间重叠。
这种方法非常适合解最大的区间重叠数量 (或最大的并行数量) 的题目,能够将时间复杂度控制在 O(nlog{n})O(nlogn),而且代码可以说是八九不离十。
下面贴出代码的模板
int maxConcurrent (vecotr<vecotr<int>>& time){
map<int, int> record;
for(auto& t : time){
record[t[0]] += 1;
record[t[1]] -= 1;
}
int ans = 0, concurrent = 0;
for(auto& p : record){
concurrent += p.second;
ans = max(ans, concurrent);
}
return ans;
}
注意:第二个循环进行遍历时应该保证 map 的键按照升序排列
那对于我的日程安排表Ⅰ 和 我的日程安排表Ⅱ 的代码,无非就是并行数量的修改:
class MyCalendar {
public:
map<int, int> rec;
MyCalendar() {}
bool book(int start, int end) {
rec[start] += 1;
rec[end] -= 1;
int cur = 0;
for(auto& p : rec){
cur += p.second;
if(cur > 2){ // 若修改成 cur > 1, 则对应着「我的日程安排表Ⅰ」 的代码
rec[start]--, rec[end]++;
return false;
}
}
return true;
}
};
而对于题目我的日程安排表Ⅲ ,那真就是和模板代码一模一样了。Easy Money!
以上就是题解的全部内容啦~~ 如果你觉得题解有用,别忘了点个赞噢!如果内容有误,也欢迎大家批评指正!
作者:laughhhh
链接:https://leetcode.cn/problems/my-calendar-ii/solution/yi-fa-jie-nti-by-laughhhh-pll7/
来源:力扣(LeetCode)
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。