目录

LC 731. 我的日程安排表 II (opens new window) (opens new window)

中等

# 问题描述

实现一个 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]

# 差分数组

利用差分数组的思想,当预定一个新的日程安排 [start,end)[start,end)startstart 的计数加 11,表示从 startstart 开始,预定数目增加 11endend 的计数减 11,表示从 endend 开始,预定数目减少 11。每次预定时,将预定时间添加到记录中,再统计预定的时间内预定数是否产生了三重预定,若是,则将本次预定移除,恢复原本的预定记录。因为数据范围比较大,所以使用离散化存储。

var MyCalendarTwo = function () {
  this.bookings = []
}

/**
 * @param {number} start
 * @param {number} end
 * @return {boolean}
 */
MyCalendarTwo.prototype.book = function (start, end) {
  const bookings = this.bookings.slice()
  bookings.push([start, 1])
  bookings.push([end, -1])
  bookings.sort((a, b) => a[0] - b[0] || a[1] - b[1])
  let cnt = 0
  for (const booking of bookings) {
    cnt += booking[1]
    if (start <= booking[0] && booking[0] < end) {
      if (cnt > 2) {
        return false
      }
    }
    if (booking[0] > end) break
  }
  this.bookings = bookings
  return true
}

/**
 * Your MyCalendarTwo object will be instantiated and called as such:
 * var obj = new MyCalendarTwo()
 * var param_1 = obj.book(start,end)
 */
  • 时间复杂度:O(n2)O(n^2),每次查询都要遍历一次,nn 次查询就是 n2n^2
  • 空间复杂度:O(n)O(n)
上次更新: 2023/01/31 19:48:05

本博客所有文章除特别声明外,均采用 CC BY-SA 4.0 协议 , 转载请注明出处!