JavaはLeetCode 731 My Schedule II(バイナリツリー)を実装します

731.私のスケジュールII

MyCalendarクラスを実装して、スケジュールを保存します。追加する時間がトリプルブッキングにならない場合は、この新しいスケジュールを保存できます。

MyCalendarには、book(int start、int end)メソッドがあります。これは、開始と終了の間にスケジュールを追加することを意味します。ここでの時間はハーフオープン間隔、つまり[開始、終了)であることに注意してください。実数xの範囲は、開始<= x <終了です。

3つのスケジュールに時間の重複がある場合(たとえば、3つのスケジュールがすべて同時に)、トリプル予約が生成されます。

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(開始、終了)を呼び出す場合、開始と終了の値の範囲は[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);
 */
リリース1775元の記事 ウォンの賞賛30000 + ビュー409万+

おすすめ

転載: blog.csdn.net/a1439775520/article/details/105430812