731. 我的日程安排表 II

实现一个 MyCalendar 类来存放你的日程安排。如果要添加的时间内不会导致三重预订时,则可以存储这个新的日程安排。

MyCalendar 有一个 book(int start, int end)方法。它意味着在 startend 时间内增加一个日程安排,注意,这里的时间是半开区间,即 [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
喜欢就支持一下吧
点赞6 分享
评论 抢沙发
头像
欢迎您留下宝贵的见解!
提交
头像

昵称

取消
昵称表情代码图片

    请登录后查看评论内容