diff options
Diffstat (limited to 'my_calendar2.c')
-rw-r--r-- | my_calendar2.c | 66 |
1 files changed, 66 insertions, 0 deletions
diff --git a/my_calendar2.c b/my_calendar2.c new file mode 100644 index 0000000..b755fbc --- /dev/null +++ b/my_calendar2.c @@ -0,0 +1,66 @@ +// 731. My Calendar II +#include "leetcode.h" + +/* + * you are implementing a program to use as your calendar. we can add a new + * event if adding the event will not cause a triple booking. a triple booking + * happens when three events have the same non empty intersection (ie. some + * moment is common to all the three event). the event can be represented as a + * pair of integers 'start' and 'end' that represents a booking on the half open + * interval '[start, end]', the range of real numbers 'x' such that 'start <= x + * < end'. + */ + +struct interval { + int start; + int end; +}; + +typedef struct { + struct interval *bookings; + int bookings_size; + struct interval *overlaps; + int overlaps_size; +} MyCalendarTwo; + +MyCalendarTwo *myCalendarTwoCreate() { + MyCalendarTwo *obj = (MyCalendarTwo *)malloc(sizeof(MyCalendarTwo)); + obj->bookings = (struct interval *)malloc(1000 * sizeof(int)); + obj->bookings_size = 0; + obj->overlaps = (struct interval *)malloc(1000 * sizeof(int)); + obj->overlaps_size = 0; + return obj; +} + +bool myCalendarTwoBook(MyCalendarTwo *obj, int start, int end) { + for (int i = 0; i < obj->overlaps_size; i++) + if (start < obj->overlaps[i].end && end > obj->overlaps[i].start) + return false; + for (int i = 0; i < obj->bookings_size; i++) + if (start < obj->bookings[i].end && end > obj->bookings[i].start) { + int overlap_start = + start > obj->bookings[i].start ? start : obj->bookings[i].start; + int overlap_end = end < obj->bookings[i].end ? end : obj->bookings[i].end; + obj->overlaps[obj->overlaps_size++] = + (struct interval){overlap_start, overlap_end}; + } + obj->bookings[obj->bookings_size++] = (struct interval){start, end}; + return true; +} + +void myCalendarTwoFree(MyCalendarTwo *obj) { + free(obj->bookings); + free(obj->overlaps); + free(obj); +} + +int main() { + MyCalendarTwo *obj = myCalendarTwoCreate(); + printf("%d\n", myCalendarTwoBook(obj, 10, 20)); // expect: 1 + printf("%d\n", myCalendarTwoBook(obj, 50, 60)); // expect: 1 + printf("%d\n", myCalendarTwoBook(obj, 10, 40)); // expect: 1 + printf("%d\n", myCalendarTwoBook(obj, 5, 15)); // expect: 0 + printf("%d\n", myCalendarTwoBook(obj, 5, 10)); // expect: 1 + printf("%d\n", myCalendarTwoBook(obj, 25, 55)); // expect: 1 + myCalendarTwoFree(obj); +} |