執行結果:通過
執行用時和內存消耗如下:
?
?
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
?結構體實例本身所占用的內存。
- 輸入參數為?
總結
這段代碼通過維護一個動態數組(實際上是成對存儲的起始和結束時間)來管理預約,并提供了創建日歷實例、預約時間段和釋放資源的接口。通過遍歷已預約的時間段來檢查新的預約是否重疊,從而決定預約是否成功。