执行结果:通过
执行用时和内存消耗如下:
typedef struct {int *booked;int bookedSize;
} MyCalendar;#define MAX_BOOK_SIZE 1001MyCalendar* myCalendarCreate() {MyCalendar *obj = (MyCalendar *)malloc(sizeof(MyCalendar));obj->booked = (int *)malloc(sizeof(int) * 2 * MAX_BOOK_SIZE);obj->bookedSize = 0;return obj;
}bool myCalendarBook(MyCalendar* obj, int start, int end) {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) {return false;}}obj->booked[obj->bookedSize * 2] = start;obj->booked[obj->bookedSize * 2 + 1] = end;obj->bookedSize++;return true;
}void myCalendarFree(MyCalendar* obj) {free(obj->booked);free(obj);
}
解题思路:
这段代码实现了一个简单的日历预约系统,允许用户预约时间段并检查预约是否成功。下面是对代码的解题思路的详细解释:
数据结构设计
首先,定义了一个结构体 MyCalendar
,用于存储日历预约系统的状态:
int *booked
:一个整型指针,用于存储已预约的时间段。这里采用了一个技巧,即每个预约用两个整数表示(起始时间和结束时间),因此实际存储的是成对的起始和结束时间。int bookedSize
:一个整型变量,记录当前已预约的时间段数量。
宏定义
定义了一个宏 MAX_BOOK_SIZE
,表示允许的最大预约数量。这里设置为 1001,意味着最多可以存储 1001 对起始和结束时间。
函数实现
myCalendarCreate
函数:- 创建一个
MyCalendar
结构体实例。 - 为
booked
指针分配内存,大小为2 * MAX_BOOK_SIZE * sizeof(int)
,因为每个预约需要两个整数(起始和结束时间),总共可以存储MAX_BOOK_SIZE
个预约。 - 初始化
bookedSize
为 0,表示当前没有预约。 - 返回创建的
MyCalendar
实例。
- 创建一个
myCalendarBook
函数:- 输入参数包括
MyCalendar
实例的指针obj
,以及要预约的时间段的起始时间start
和结束时间end
。 - 遍历所有已预约的时间段,检查新的预约是否与任何现有预约重叠。重叠的条件是:新预约的起始时间小于现有预约的结束时间,并且新预约的结束时间大于现有预约的起始时间。
- 如果发现重叠,则返回
false
,表示预约失败。 - 如果没有重叠,将新预约的起始和结束时间添加到
booked
数组中,并增加bookedSize
。 - 返回
true
,表示预约成功。
- 输入参数包括
myCalendarFree
函数:- 输入参数为
MyCalendar
实例的指针obj
。 - 释放
booked
指针所指向的内存。 - 释放
obj
结构体实例本身所占用的内存。
- 输入参数为
总结
这段代码通过维护一个动态数组(实际上是成对存储的起始和结束时间)来管理预约,并提供了创建日历实例、预约时间段和释放资源的接口。通过遍历已预约的时间段来检查新的预约是否重叠,从而决定预约是否成功。