-
Notifications
You must be signed in to change notification settings - Fork 92
/
MyCalendarI729.java
90 lines (77 loc) · 2.94 KB
/
MyCalendarI729.java
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
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
/**
* 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].
*/
public class MyCalendarI729 {
class MyCalendar {
private TreeSet<Interval> intervals = new TreeSet<>((i1, i2) -> Integer.compare(i1.start, i2.start));
public MyCalendar() {
}
public boolean book(int start, int end) {
Interval inv = new Interval(start, end);
Interval ceiling = intervals.ceiling(inv);
if (ceiling != null && ceiling.start < end) return false;
Interval floor = intervals.floor(inv);
if (floor != null && floor.end > start) return false;
intervals.add(inv);
return true;
}
class Interval {
int start;
int end;
Interval(int s, int e) {
start = s;
end = e;
}
}
}
class MyCalendar2 {
private TreeMap<Integer, Integer> intervals = new TreeMap<>();
public MyCalendar() {
}
public boolean book(int start, int end) {
Map.Entry<Integer, Integer> ceiling = intervals.ceilingEntry(start);
if (ceiling != null && ceiling.getKey() < end) return false;
Map.Entry<Integer, Integer> floor = intervals.floorEntry(start);
if (floor != null && floor.getValue() > start) return false;
intervals.put(start, end);
return true;
}
}
/**
* Your MyCalendar object will be instantiated and called as such:
* MyCalendar obj = new MyCalendar();
* boolean param_1 = obj.book(start,end);
*/
}