面试算法58:日程表

题目

请实现一个类型MyCalendar用来记录自己的日程安排,该类型用方法book(int start,int end)在日程表中添加一个时间区域为[start,end)的事项(这是一个半开半闭区间)。如果[start,end)中之前没有安排其他事项,则成功添加该事项并返回true;否则,不能添加该事项,并返回false。
例如,在下面的3次调用book方法中,第2次调用返回false,这是因为时间[15,20)已经被第1次调用预留了。由于第1次占用的时间是一个半开半闭区间,并没有真正占用时间20,因此不影响第3次调用预留时间区间[20,30)。
面试算法58:日程表_第1张图片

分析

如果待添加的事项占用的时间区间是[m,n),就需要找出开始时间小于m的所有事项中开始最晚的一个,以及开始时间大于m的所有事项中开始最早的一个。如果待添加的事项和这两个事项都没有重叠,那么该事项可以添加在日程表中。

public class MyCalendar {
    private TreeMap<Integer,Integer> events;

    public MyCalendar(){
        events = new TreeMap<>();
    }

    public static void main(String[] args) {
        MyCalendar cal = new MyCalendar();
        System.out.println(cal.book(10, 20));
        System.out.println(cal.book(15, 25));
        System.out.println(cal.book(20, 30));
    }

    public boolean book(int start,int end){
        // 地板:返回键小于或等于给定值的最大映射,如果没有则返回null
        Map.Entry<Integer,Integer> event = events.floorEntry(start);
        if (event != null && event.getValue() > start){
            return false;
        }

        // 天花板:返回键大于或等于给定值的最小映射,如果没有则返回null
        event = events.ceilingEntry(start);
        if (event != null && event.getKey() < end){
            return false;
        }

        events.put(start,end);
        return true;
    }
}

你可能感兴趣的:(算法,面试,算法,java)