。我的日历二
731。我的日历 II
难度:中等
主题:数组、二分查找、设计、线段树、前缀和、有序集
您正在实现一个程序来用作您的日历。如果添加活动不会导致三重预订。
,我们可以添加新活动三重预订发生在三个事件有一些非空交叉点时(即,某些时刻是所有三个事件共有的。)。
事件可以表示为一对整数 start 和 end,表示半开区间 [start, end) 上的预订,实数 x 的范围使得 start
实现 MyCalendarTwo 类:
- MyCalendarTwo() 初始化日历对象。
- boolean book(int start, int end) 如果事件可以成功添加到日历而不会导致三重预订,则返回true。否则,返回 false 并且不将事件添加到日历。
示例1:
- 输入:
["MyCalendarTwo", "book", "book", "book", "book", "book", "book"] [[], [10, 20], [50, 60], [10, 40], [5, 15], [5, 10], [25, 55]]
- 输出:
[null, true, true, true, false, true, true]
- 说明:
MyCalendarTwo myCalendarTwo = new MyCalendarTwo(); myCalendarTwo.book(10, 20); // return True, The event can be booked. myCalendarTwo.book(50, 60); // return True, The event can be booked. myCalendarTwo.book(10, 40); // return True, The event can be double booked. myCalendarTwo.book(5, 15); // return False, The event cannot be booked, because it would result in a triple booking. myCalendarTwo.book(5, 10); // return True, The event can be booked, as it does not use time 10 which is already double booked. myCalendarTwo.book(25, 55); // return True, The event can be booked, as the time in [25, 40) will be double booked with the third event, the time [40, 50) will be single booked, and the time [50, 55) will be double booked with the second event.
约束:
- 0 9
- 最多可拨打1000个电话进行预订。
提示:
- 存储两个排序的间隔列表:一个列表将是至少单次预订的所有时间,另一个列表将是所有肯定被双重预订的时间。如果两次预订均不冲突,则预订成功,您应相应更新您的单次和双人预订。
解决方案:
我们需要维护两个预订列表:
- 单次预订:跟踪一次预订的所有活动的列表。
- 双重预订:跟踪所有双重预订活动的列表。
当请求新活动时,我们需要检查是否会导致三重预订。为此:
- 我们首先检查新活动是否与双重预订列表中的任何时间间隔重叠。如果是这样,我们无法添加该活动,因为这会导致三重预订。
- 如果与双重预订没有重叠,我们会检查单次预订列表,并将新活动与现有活动的重叠添加到双重预订中 列表。
最后,如果活动通过了两项检查,我们会将其添加到单次预订列表中。
让我们用 PHP 实现这个解决方案:731。我的日历 II
<?php class MyCalendarTwo { /** * @var array */ private $singleBookings; /** * @var array */ private $doubleBookings; /** */ function __construct() { ... ... ... /** * go to ./solution.php */ } /** * @param Integer $start * @param Integer $end * @return Boolean */ function book($start, $end) { ... ... ... /** * go to ./solution.php */ } } /** * Your MyCalendarTwo object will be instantiated and called as such: * $obj = MyCalendarTwo(); * $ret_1 = $obj->book($start, $end); */ // Example Usage $calendar = new MyCalendarTwo(); echo $calendar->book(10, 20) ? 'true' : 'false'; // true echo "\n"; echo $calendar->book(50, 60) ? 'true' : 'false'; // true echo "\n"; echo $calendar->book(10, 40) ? 'true' : 'false'; // true echo "\n"; echo $calendar->book(5, 15) ? 'true' : 'false'; // false echo "\n"; echo $calendar->book(5, 10) ? 'true' : 'false'; // true echo "\n"; echo $calendar->book(25, 55) ? 'true' : 'false'; // true echo "\n"; ?>
解释:
构造函数(__construct):用两个空数组初始化日历对象,以存储单次预订和双次预订。
-
图书功能(书籍):
- 该函数获取事件的开始和结束。
- 它首先检查事件是否与 doubleBookings 列表中的任何间隔重叠。如果是,该函数将返回 false,因为这将导致三重预订。
- 如果没有三重预订,它会检查单次预订列表中活动的重叠情况。发现的任何重叠都会添加到双重预订列表中,因为它现在代表双重预订。
- 最后,该事件被添加到 singleBookings 列表中,并且函数返回 true。
时间复杂度:
- 每次预订操作的时间复杂度约为 O(n),其中 n 是迄今为止进行的预订数量。这是因为对于每个预订,我们可能需要在 singleBookings 和 doubleBookings 列表中检查所有之前的预订。
此解决方案可根据问题约束的要求有效处理多达 1000 次对 book 函数的调用。
联系链接
如果您发现本系列有帮助,请考虑在 GitHub 上给 存储库 一个星号或在您最喜欢的社交网络上分享该帖子?。您的支持对我来说意义重大!
如果您想要更多类似的有用内容,请随时关注我:
- 领英
- GitHub
以上是。我的日历二的详细内容。更多信息请关注PHP中文网其他相关文章!

热AI工具

Undresser.AI Undress
人工智能驱动的应用程序,用于创建逼真的裸体照片

AI Clothes Remover
用于从照片中去除衣服的在线人工智能工具。

Undress AI Tool
免费脱衣服图片

Clothoff.io
AI脱衣机

AI Hentai Generator
免费生成ai无尽的。

热门文章

热工具

记事本++7.3.1
好用且免费的代码编辑器

SublimeText3汉化版
中文版,非常好用

禅工作室 13.0.1
功能强大的PHP集成开发环境

Dreamweaver CS6
视觉化网页开发工具

SublimeText3 Mac版
神级代码编辑软件(SublimeText3)

热门话题

JWT是一种基于JSON的开放标准,用于在各方之间安全地传输信息,主要用于身份验证和信息交换。1.JWT由Header、Payload和Signature三部分组成。2.JWT的工作原理包括生成JWT、验证JWT和解析Payload三个步骤。3.在PHP中使用JWT进行身份验证时,可以生成和验证JWT,并在高级用法中包含用户角色和权限信息。4.常见错误包括签名验证失败、令牌过期和Payload过大,调试技巧包括使用调试工具和日志记录。5.性能优化和最佳实践包括使用合适的签名算法、合理设置有效期、

文章讨论了PHP 5.3中引入的PHP中的晚期静态结合(LSB),从而允许静态方法的运行时分辨率调用以获得更灵活的继承。 LSB的实用应用和潜在的触摸

SOLID原则在PHP开发中的应用包括:1.单一职责原则(SRP):每个类只负责一个功能。2.开闭原则(OCP):通过扩展而非修改实现变化。3.里氏替换原则(LSP):子类可替换基类而不影响程序正确性。4.接口隔离原则(ISP):使用细粒度接口避免依赖不使用的方法。5.依赖倒置原则(DIP):高低层次模块都依赖于抽象,通过依赖注入实现。

使用PHP的cURL库发送JSON数据在PHP开发中,经常需要与外部API进行交互,其中一种常见的方式是使用cURL库发送POST�...

如何在系统重启后自动设置unixsocket的权限每次系统重启后,我们都需要执行以下命令来修改unixsocket的权限:sudo...
