算法小知识-----8.07-----我的日程安排I

127 阅读2分钟

携手创作,共同成长!这是我参与「掘金日新计划 · 8 月更文挑战」的第10天,点击查看活动详情

今天是周日,临急抱佛脚了,也庆幸能冲出一题

我的日程安排I

该题出自力扣的729题 —— 我的日程安排I【中等题】,经典线段树,用了,但是没有完全使用哈哈哈

审题

实现一个 MyCalendar 类来存放你的日程安排。如果要添加的日程安排不会造成 重复预订 ,则可以存储这个新的日程安排。
当两个日程安排有一些时间上的交叉时(例如两个日程安排都在同一时间内),就会产生 重复预订 。

  • 日程可以用一对整数 start 和 end 表示,这里的时间是半开区间,即 [start, end), 实数 x 的范围为,  start <= x < end 。
  • 实现 MyCalendar 类:
  • MyCalendar() 初始化日历对象。
  • boolean book(int start, int end) 如果可以将日程安排成功添加到日历中而不会导致重复预订,返回 true 。否则,返回 false 并且不要将该日程安排添加到日历中。
  • 题意相对拗口,但是并不难理解,届时每次调用book方法都会传入两个预定时间,需要判断预定的时间是否会对之前的时间冲突

  • 利用线段树可以解决,但是选择了另一种方法

  • 利用HashMap的相关API,判断是否存在冲突

    • ceilingKey :返回大于或等于给定键的最小键,如果没有这样的键,则null
    • floorKey: 返回小于或等于给定键的最大键,如果没有这样的键,则null
  • 因此可以利用cellingKey去传入start,判断大于start的最小值的 结束时间,是否比end的时间要小,如果小则证明包含在内

  • 利用floorKey传入start,判断小于start的最大值的结束时间,是否比start要大,则证明包含在内

  • 可推断出book方法的实现

  • 初始化方法,需要利用TreeMap

编码

class MyCalendar {
    public MyCalendar() {
        map = new TreeMap<>();
        map.put(-1,-1);
        map.put(1000000000,1000000000);
    }
    TreeMap<Integer,Integer> map;

    public boolean book(int start, int end) {
        Integer max = map.ceilingKey(start);
        Integer min = map.floorKey(start);
        if (max < end || map.get(min) > start)return false;
        map.put(start,end);
        return true;
    }
}

image.png