Java implementa LeetCode 731 My Schedule II (árbol binario)

731. Mi horario II

Implemente una clase MyCalendar para almacenar su horario. Si el tiempo a agregar no resulta en una reserva triple, este nuevo horario puede almacenarse.

MyCalendar tiene un método de libro (int start, int end). Significa agregar un cronograma entre el inicio y el final Tenga en cuenta que el tiempo aquí es un intervalo medio abierto, es decir, [inicio, final], el rango del número real x es, inicio <= x <final.

Cuando los tres horarios tienen cierta superposición de tiempo (por ejemplo, los tres horarios son todos al mismo tiempo), se generará una reserva triple.

Cada vez que se llama al método MyCalendar.book, si la programación se puede agregar con éxito al calendario sin causar una reserva triple, devuelva verdadero. De lo contrario, devuelva falso y no agregue la programación al calendario.

Siga los pasos a continuación para llamar a la clase MyCalendar: MyCalendar cal = new MyCalendar (); MyCalendar.book (inicio, fin)

Ejemplos:

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)将和第二个日程安排双重预订。

Consejos:

Para cada caso de prueba, llame a la función MyCalendar.book no más de 1000 veces.
Al llamar a la función MyCalendar.book (inicio, fin), el rango de valores de inicio y fin es [0, 10 ^ 9].

class MyCalendarTwo {

        class BSTNode{
        int start, end;
        //这个变量用来看是不是三重的
        //开始是false,插入一个就是true,在插入的话如果是true就是三重
        boolean overlap;
        BSTNode left, right;
        public BSTNode(int s, int e) {
            this.start = s; this.end = e;
            this.overlap = false;
        }
    }

    BSTNode root;

    public MyCalendarTwo() {

    }
    
    public boolean book(int start, int end) {
        if (!insertable(root, start, end)) return false;
        root = insert(root, start, end);
        return true;
    }

    private boolean insertable(BSTNode node, int start, int end) {
        if (start >= end || node == null)
            return true;

        if (start >= node.end)
            return insertable(node.right, start, end);
        if (end <= node.start)
            return insertable(node.left, start, end);
        
        if (node.overlap) return false;

        if (node.start <= start && end <= node.end) 
            return true;

        return insertable(node.left, start, node.start) &&
                insertable(node.right, node.end, end);
    }

    private BSTNode insert(BSTNode node, int start, int end) {
        if (start >= end) return node;
        if (node == null) {
            return new BSTNode(start, end);
        }

        if (node.start >= end) {
            node.left = insert(node.left, start, end);
            return node;
        }

        if (node.end <= start) {
            node.right = insert(node.right, start, end);
            return node;
        }

        int minS = Math.min(start, node.start);
        int maxS = Math.max(start, node.start);
        int minE = Math.min(end, node.end);
        int maxE = Math.max(end, node.end);

        node.start = maxS;
        node.end = minE;
        node.overlap = true;

        node.left = insert(node.left, minS, maxS);
        node.right = insert(node.right, minE, maxE);

        return node;
    }
}

/**
 * Your MyCalendarTwo object will be instantiated and called as such:
 * MyCalendarTwo obj = new MyCalendarTwo();
 * boolean param_1 = obj.book(start,end);
 */
Publicado 1,775 artículos originales · Más de 30,000 me gusta · · 4.09 millones de visitas

Supongo que te gusta

Origin blog.csdn.net/a1439775520/article/details/105430812
Recomendado
Clasificación