我的日程安排表I II III

本文介绍了如何运用「插旗法」解决区间最大重叠问题,包括在LeetCode上的「我的日程安排表」系列题目。通过进入和离开区间时更新计数,可以在O(nlog{n}

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

我的日程安排表I
我的日程安排表II
我的日程安排表III

转载做题方法!

今天介绍的方法叫插旗法,其实我最早是在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)
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值