题目描述
实现一个 MyCalendar 类来存放你的日程安排,你可以一直添加新的日程安排。
MyCalendar 有一个 book(int start, int end)方法。它意味着在start到end时间内增加一个日程安排,注意,这里的时间是半开区间,即 [start, end), 实数 x 的范围为, start <= x < end。
当 K 个日程安排有一些时间上的交叉时(例如K个日程安排都在同一时间内),就会产生 K 次预订。
每次调用 MyCalendar.book方法时,返回一个整数 K ,表示最大的 K 次预订。
请按照以下步骤调用MyCalendar 类: MyCalendar cal = new MyCalendar(); MyCalendar.book(start, end)
样例
MyCalendarThree();
MyCalendarThree.book(10, 20); // returns 1
MyCalendarThree.book(50, 60); // returns 1
MyCalendarThree.book(10, 40); // returns 2
MyCalendarThree.book(5, 15); // returns 3
MyCalendarThree.book(5, 10); // returns 3
MyCalendarThree.book(25, 55); // returns 3
C 代码
#define COUNT 801
//
struct Node {
int key;
int value;
};
typedef struct {
struct Node n[COUNT];
} MyCalendarThree;
int comp(const void* a, const void *b)
{
if (((struct Node *)a)->key == ((struct Node *)b)->key) {
return ((struct Node*)a)->value - ((struct Node*)b)->value;
}
return ((struct Node*)a)->key - ((struct Node *)b)->key;
}
MyCalendarThree* myCalendarThreeCreate() {
MyCalendarThree* ans = (MyCalendarThree*)malloc(sizeof(MyCalendarThree));
for (int i = 0; i < COUNT; i ++ ) {
ans->n[i].key = 0x7fffffff;
}
return ans;
}
int myCalendarThreeBook(MyCalendarThree* obj, int start, int end) {
obj->n[COUNT - 2].key = start;
obj->n[COUNT - 2].value = 1;
obj->n[COUNT - 1].key = end;
obj->n[COUNT - 1].value = -1;
qsort(obj->n, COUNT, sizeof(struct Node), comp);
int ans = 0;
int temp = 0;
for (int i = 0; i < COUNT && obj->n[i].key != 0x7fffffff; i ++ ) {
temp += obj->n[i].value;
ans = ans < temp ? temp : ans;
}
return ans;
}
void myCalendarThreeFree(MyCalendarThree* obj) {
free(obj);
}