aboutsummaryrefslogtreecommitdiff
path: root/my_calendar2.c
diff options
context:
space:
mode:
Diffstat (limited to 'my_calendar2.c')
-rw-r--r--my_calendar2.c66
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);
+}