一日一练:我的日常安排表I

164 阅读1分钟

实现 MyCalendar 类:MyCalendar() 初始化日历对象。boolean book(int start, int end) 如果可以将日程安排成功添加到日历中而不会导致重复预订,返回 true 。否则,返回 false 并且不要将该日程安排添加到日历

维护一个数组,每次有新的日程安排时,先判断当前日程是否会产生重复日程:如果产生直接返回false;不产生的话,加新日程加入数组中,同时返回true

判断方法的话:用当前日程时间[curStartTime, curEndTime]与数组中维护的所有已有日程做比对:

假设已有日程队列中有一个日程时间为[aStartTime, aEndTime],满足下面两点即没有交集,即没有重复预定

  • 当前日程的开始时间大于等于队列中的每个日程的结束时间,即curStartTime >= aEndTime
  • 前日程的结束时间小于等于队列中的每个日程的开始时间,即curEndTime <= aStartTime

代码

class MyCalendar {
  public data: [number, number][]

  constructor() {
    this.data = []
  }

  book(start: number, end: number): boolean {
    // 当前没有日程
    if (this.data.length === 0) {
      this.data.push([start, end])
      return true
    }
    // 加入没有交集
    let isMixed = false
    for (let i = 0; i < this.data.length; i++) {
      const cur = this.data[i]
      // 如果要保证不存在交集,不产生重复日程     
      if (!(cur[0] >= end || cur[1] <= start)) {
        isMixed = true
        break
      }
    }
    // 重复返回false 不重复加入日程同时返回true
    if (isMixed) {
      return false
    } else {
      this.data.push([start, end])
      return true
    }
  }
}