当前位置: 首页 > article >正文

【Leetcode】732. 我的日程安排表 III

文章目录

  • 题目
  • 思路
  • 代码
  • 复杂度分析
    • 时间复杂度
    • 空间复杂度
  • 结果
  • 总结

题目

题目链接🔗
k k k 个日程存在一些非空交集时(即, k k k 个日程包含了一些相同时间),就会产生 k k k 次预订。

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

实现一个 M y C a l e n d a r T h r e e MyCalendarThree MyCalendarThree 类来存放你的日程安排,你可以一直添加新的日程安排。

M y C a l e n d a r T h r e e ( ) MyCalendarThree() MyCalendarThree() 初始化对象。
i n t b o o k ( i n t s t a r t T i m e , i n t e n d T i m e ) int book(int startTime, int endTime) intbook(intstartTime,intendTime) 返回一个整数 k ,表示日历中存在的 k k k 次预订的最大值。

示例:

输入: [“MyCalendarThree”, “book”, “book”, “book”, “book”, “book”,
“book”] [[], [10, 20], [50, 60], [10, 40], [5, 15], [5, 10], [25, 55]]
输出: [null, 1, 1, 2, 3, 3, 3]

解释: MyCalendarThree myCalendarThree = new MyCalendarThree();
myCalendarThree.book(10, 20); // 返回 1 ,第一个日程安排可以预订并且不存在相交,所以最大 k 次预订是
1 次预订。 myCalendarThree.book(50, 60); // 返回 1 ,第二个日程安排可以预订并且不存在相交,所以最大
k 次预订是 1 次预订。 myCalendarThree.book(10, 40); // 返回 2 ,第三个日程安排 [10, 40)
与第一个日程安排相交,所以最大 k 次预订是 2 次预订。 myCalendarThree.book(5, 15); // 返回 3
,剩下的日程安排的最大 k 次预订是 3 次预订。 myCalendarThree.book(5, 10); // 返回 3
myCalendarThree.book(25, 55); // 返回 3

提示:

  1. 0 ≤ s t a r t T i m e < e n d T i m e ≤ 1 0 9 0 \leq startTime < endTime \leq 10^9 0startTime<endTime109
    每个测试用例,调用 b o o k book book 函数最多不超过 400 400 400

思路

k k k 个日程存在一些非空交集时(即, k k k 个日程包含了一些相同时间),就会产生 k k k 次预订。那么可以转化为:理解成start时刻预定了一人,可能后面还会又预定了一人,end时刻离开,求预定的人数最大值,预定时间为整数,可以使用差分来实现

代码

class MyCalendarThree {
public:
    map<int,int> m;
    MyCalendarThree() {
    }
    
    int book(int startTime, int endTime) {
        // 在 startTime 处增加一个活动
        ++m[startTime];
        // 在 endTime 处减少一个活动
        --m[endTime];

        int sum = 0; // 当前重叠的活动数
        int maxOverlap = 0; // 最大重叠的活动数

        // 遍历时间点,计算最大重叠数
        for (map<int, int>::iterator it = m.begin(); it != m.end(); ++it) {
            sum += it->second;
            if (sum > maxOverlap) {
                maxOverlap = sum;
            }
        }

        return maxOverlap;
    }
};

/**
 * Your MyCalendarThree object will be instantiated and called as such:
 * MyCalendarThree* obj = new MyCalendarThree();
 * int param_1 = obj->book(startTime,endTime);
 */

复杂度分析

时间复杂度

每次调用 b o o k book book 方法时:
在有序映射 m m m 中插入或更新两个键值对( s t a r t T i m e startTime startTime e n d T i m e endTime endTime),每次操作的时间复杂度为 O ( l o g N ) O(log N) O(logN),其中 N N N 是当前映射中的键的数量。
遍历映射 m m m 以计算最大重叠数,时间复杂度为 O ( N ) O(N) O(N)

空间复杂度

映射 m m m 中存储了所有的时间点,每个时间点对应一个活动的开始或结束。
在最坏情况下,可能每个活动都有唯一的开始和结束时间点,因此空间复杂度为 O ( N ) O(N) O(N)

结果

在这里插入图片描述

总结

使用差分数组可以高效地对数组的连续区间进行加法操作,避免了对每个区间内的元素逐一更新。


http://www.kler.cn/a/467477.html

相关文章:

  • 【insert 插入数据语法合集】.NET开源ORM框架 SqlSugar 系列
  • 【视觉SLAM:六、视觉里程计Ⅰ:特征点法】
  • 海外云服务器能用来做什么?
  • ceph集群配置
  • 基于Spring Boot的车辆违章信息管理系统(LW+源码+讲解)
  • 连接Milvus
  • Qlib量化回测安装以及使用
  • TIM的中断
  • 通往O1开源之路
  • 基于Spring Boot智能无人仓库管理系统【附源码】
  • PADS Logic原理图中有很多页原理图,如何(怎样)删除其中一页或者多页
  • Linux之ARM(MX6U)裸机篇----8.主频和时钟配置实验
  • AWS EMR基础知识
  • 【ArcGISPro/GeoScenePro】裁剪和打包栅格数据
  • 1、数据结构之:树的相关定义和二叉树
  • Java接入阿里云日志服务
  • JAVA构造方法练习
  • 光伏安装在屋顶:安全、环保还是潜在威胁?
  • ithewei的2024年度总结
  • VB.NET CRC32 校验
  • 智能工厂的设计软件 应用场景的一个例子: 为AI聊天工具添加一个知识系统 之19 再次重建 之5 项目文件三大部
  • 《learn_the_architecture_-_generic_interrupt_controller_v3_and_v4__lpisn》学习笔记
  • 内部类 --- (寄生的哲学)
  • MQ消息队列
  • 【GBT32960协议学习系列】GBT 32960协议学习大纲
  • 【Seed-Labs 2.0】Buffer Overflow Attack Lab (Server Version)