友情支持
如果您觉得这个笔记对您有所帮助,看在D瓜哥码这么多字的辛苦上,请友情支持一下,D瓜哥感激不尽,😜
|
|
有些打赏的朋友希望可以加个好友,欢迎关注D 瓜哥的微信公众号,这样就可以通过公众号的回复直接给我发信息。

公众号的微信号是: jikerizhi。因为众所周知的原因,有时图片加载不出来。 如果图片加载不出来可以直接通过搜索微信号来查找我的公众号。 |
731. 我的日程安排表 II
实现一个 `MyCalendar`类来存放你的日程安排。如果要添加的时间内不会导致三重预订时,则可以存储这个新的日程安排。
MyCalendar 有一个 book(int start, int end)`方法。它意味着在 `start 到 end 时间内增加一个日程安排,注意,这里的时间是半开区间,即 [start, end), 实数 x 的范围为,start <= x < end。
当三个日程安排有一些时间上的交叉时(例如三个日程安排都在同一时间内),就会产生三重预订。
每次调用 MyCalendar.book`方法时,如果可以将日程安排成功添加到日历中而不会导致三重预订,返回 `true。否则,返回 false 并且不要将该日程安排添加到日历中。
请按照以下步骤调用`MyCalendar` 类: MyCalendar cal = new MyCalendar(); MyCalendar.book(start, end)
示例:
MyCalendar(); MyCalendar.book(10, 20); // returns true MyCalendar.book(50, 60); // returns true MyCalendar.book(10, 40); // returns true MyCalendar.book(5, 15); // returns false MyCalendar.book(5, 10); // returns true MyCalendar.book(25, 55); // returns true 解释: 前两个日程安排可以添加至日历中。 第三个日程安排会导致双重预订,但可以添加至日历中。 第四个日程安排活动(5,15)不能添加至日历中,因为它会导致三重预订。 第五个日程安排(5,10)可以添加至日历中,因为它未使用已经双重预订的时间10。 第六个日程安排(25,55)可以添加至日历中,因为时间 [25,40] 将和第三个日程安排双重预订; 时间 [40,50] 将单独预订,时间 [50,55)将和第二个日程安排双重预订。
提示:
-
每个测试用例,调用
MyCalendar.book函数最多不超过1000次。 -
调用函数
MyCalendar.book(start, end)时,start和end的取值范围为[0, 109]。
思路分析
没想到竟然可以使用差分数组!
-
一刷
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
/**
* @author D瓜哥 · https://www.diguage.com
* @since 2026-05-31 21:44:41
*/
class MyCalendarTwo {
private TreeMap<Integer, Integer> counter;
public MyCalendarTwo() {
counter = new TreeMap<>();
}
public boolean book(int startTime, int endTime) {
counter.put(startTime, counter.getOrDefault(startTime, 0) + 1);
counter.put(endTime, counter.getOrDefault(endTime, 0) - 1);
int book = 0;
for (Map.Entry<Integer, Integer> entry : counter.entrySet()) {
book += entry.getValue();
if (book > 2) {
counter.put(startTime, counter.get(startTime) - 1);
counter.put(endTime, counter.get(endTime) + 1);
return false;
}
}
return true;
}
}

