友情支持

如果您觉得这个笔记对您有所帮助,看在D瓜哥码这么多字的辛苦上,请友情支持一下,D瓜哥感激不尽,😜

支付宝

微信

有些打赏的朋友希望可以加个好友,欢迎关注D 瓜哥的微信公众号,这样就可以通过公众号的回复直接给我发信息。

wx jikerizhi

公众号的微信号是: jikerizhi因为众所周知的原因,有时图片加载不出来。 如果图片加载不出来可以直接通过搜索微信号来查找我的公众号。

731. 我的日程安排表 II

实现一个 `MyCalendar`类来存放你的日程安排。如果要添加的时间内不会导致三重预订时,则可以存储这个新的日程安排。

MyCalendar 有一个 book(int start, int end)`方法。它意味着在 `startend 时间内增加一个日程安排,注意,这里的时间是半开区间,即 [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) 时, startend 的取值范围为 [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;
  }
}