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);
*/