实现一个 MyCalendar
类来存放你的日程安排。如果要添加的时间内不会导致三重预订时,则可以存储这个新的日程安排。
MyCalendar
有一个 book(int start, int end)
方法。它意味着在 start
到 end
时间内增加一个日程安排,注意,这里的时间是半开区间,即 [start, end)
, 实数 x 的范围为, start <= x < end
。
当三个日程安排有一些时间上的交叉时(例如三个日程安排都在同一时间内),就会产生三重预订。
每次调用 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)将和第二个日程安排双重预订。
C语言代码演示
typedef struct {
int *booked; //日程安排
int bookedSize; //总预定数
int *overlaps; //二重预定
int overlapsSize; //二重预定数
} MyCalendarTwo;
#define MAX_BOOK_SIZE 1001
#define MIN(a, b) ((a) < (b) ? (a) : (b))
#define MAX(a, b) ((a) > (b) ? (a) : (b))
MyCalendarTwo* myCalendarTwoCreate() {
MyCalendarTwo *obj = (MyCalendarTwo *)malloc(sizeof(MyCalendarTwo));
obj->booked = (int *)malloc(sizeof(int) * 2 * MAX_BOOK_SIZE);
obj->overlaps = (int *)malloc(sizeof(int) * 2 * MAX_BOOK_SIZE);
obj->bookedSize = 0;
obj->overlapsSize = 0;
return obj;
}
bool myCalendarTwoBook(MyCalendarTwo* obj, int start, int end) {
for (int i = 0; i < obj->overlapsSize; i++) { //对比二重预定判断是否有三重预定
int l = obj->overlaps[2 * i];
int r = obj->overlaps[2 * i + 1];
if (l < end && start < r) {
return false;
}
}
for (int i = 0; i < obj->bookedSize; i++) { //判断是否为二重预定
int l = obj->booked[2 * i];
int r = obj->booked[2 * i + 1];
if (l < end && start < r) {
obj->overlaps[obj->overlapsSize * 2] = MAX(l, start);
obj->overlaps[obj->overlapsSize * 2 + 1] = MIN(r, end);
obj->overlapsSize++;
}
}
obj->booked[obj->bookedSize * 2] = start; //存入日程
obj->booked[obj->bookedSize * 2 + 1] = end;
obj->bookedSize++;
return true;
}
void myCalendarTwoFree(MyCalendarTwo* obj) {
free(obj->booked);
free(obj->overlaps);
}
© 版权声明
文章版权归作者所有,未经允许请勿转载。
THE END
喜欢就支持一下吧