-
Notifications
You must be signed in to change notification settings - Fork 154
/
my-calendar-i.js
69 lines (62 loc) · 1.99 KB
/
my-calendar-i.js
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
/**
* My Calendar I
*
* Implement a MyCalendar class to store your events. A new event can be added if adding the
* event will not cause a double booking.
*
* Your class will have the method, book(int start, int end). Formally, this represents a booking
* on the half open interval [start, end), the range of real numbers x such that start <= x < end.
*
* A double booking happens when two events have some non-empty intersection (ie., there is some
* time that is common to both events.)
*
* For each call to the method MyCalendar.book, return true if the event can be added to the calendar
* successfully without causing a double booking. Otherwise, return false and do not add the event to
* the calendar.
*
* Your class will be called like this: MyCalendar cal = new MyCalendar(); MyCalendar.book(start, end)
*
* Example 1:
*
* MyCalendar();
* MyCalendar.book(10, 20); // returns true
* MyCalendar.book(15, 25); // returns false
* MyCalendar.book(20, 30); // returns true
*
* Explanation:
* The first event can be booked. The second can't because time 15 is already booked by another event.
* The third event can be booked, as the first event takes every time less than 20, but not including 20.
*
* Note:
*
* The number of calls to MyCalendar.book per test case will be at most 1000.
* In calls to MyCalendar.book(start, end), start and end are integers in the range [0, 10^9].
*/
class MyCalendar {
constructor() {
this.intervals = [];
}
/**
* @param {number} start
* @param {number} end
* @return {boolean}
*/
book(start, end) {
let lo = 0;
let hi = this.intervals.length - 1;
while (lo <= hi) {
const mid = lo + Math.floor((hi - lo) / 2);
const interval = this.intervals[mid];
if (end <= interval[0]) {
hi = mid - 1;
} else if (start >= interval[1]) {
lo = mid + 1;
} else {
return false;
}
}
this.intervals.splice(lo, 0, [start, end]);
return true;
}
}
export { MyCalendar };