-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy path729-MyCalendarI.go
More file actions
139 lines (118 loc) · 4.16 KB
/
729-MyCalendarI.go
File metadata and controls
139 lines (118 loc) · 4.16 KB
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
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
package main
// 729. My Calendar I
// You are implementing a program to use as your calendar.
// We can add a new event if adding the event will not cause a double booking.
// A double booking happens when two events have some non-empty intersection (i.e., some moment is common to both events.).
// 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.
// Implement the MyCalendar class:
// MyCalendar()
// Initializes the calendar object.
// boolean book(int start, int end)
// Returns 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.
// Example 1:
// Input
// ["MyCalendar", "book", "book", "book"]
// [[], [10, 20], [15, 25], [20, 30]]
// Output
// [null, true, false, true]
// Explanation
// MyCalendar myCalendar = new MyCalendar();
// myCalendar.book(10, 20); // return True
// myCalendar.book(15, 25); // return False, It can not be booked because time 15 is already booked by another event.
// myCalendar.book(20, 30); // return True, The event can be booked, as the first event takes every time less than 20, but not including 20.
// Constraints:
// 0 <= start < end <= 10^9
// At most 1000 calls will be made to book.
import "fmt"
type MyCalendar struct {
data [][]int
}
func Constructor() MyCalendar {
return MyCalendar{}
}
func (this *MyCalendar) Book(start int, end int) bool {
// 判断时间范围是否已占用
for _, v := range this.data {
if start >= v[0] && start < v[1] { // [10, 20] [15, 25]
return false
}
if start <= v[0] && end > v[0] { // [10, 20] [5, 25]
return false
}
}
this.data = append(this.data,[]int{ start, end })
return true
}
type node struct {
left, right *node
start, end int
}
func NewNode(start, end int) *node {
return &node{nil, nil, start, end}
}
type MyCalendar1 struct {
root *node
}
func Constructor1() MyCalendar1 {
return MyCalendar1{root: nil}
}
func (this *MyCalendar1) Book(start int, end int) bool {
if this.root == nil {
this.root = NewNode(start, end)
return true
}
c := this.root
for c != nil {
if end <= c.start {
if c.left == nil {
c.left = NewNode(start, end)
return true
}
c = c.left
} else if start >= c.end {
if c.right == nil {
c.right = NewNode(start, end)
return true
}
c = c.right
} else {
break
}
}
return false
}
/**
* Your MyCalendar object will be instantiated and called as such:
* obj := Constructor();
* param_1 := obj.Book(start,end);
*/
func main() {
// MyCalendar myCalendar = new MyCalendar();
obj := Constructor()
// myCalendar.book(10, 20); // return True
fmt.Println(obj.Book(10,20)) // true
fmt.Println(obj)
// myCalendar.book(15, 25); // return False, It can not be booked because time 15 is already booked by another event.
fmt.Println(obj.Book(15,25)) // false
fmt.Println(obj)
// myCalendar.book(20, 30); // return True, The event can be booked, as the first event takes every time less than 20, but not including 20.
fmt.Println(obj.Book(20,30)) // false
fmt.Println(obj)
fmt.Println(obj.Book(5,18)) // false
fmt.Println(obj)
// MyCalendar myCalendar = new MyCalendar();
obj1 := Constructor1()
// myCalendar.book(10, 20); // return True
fmt.Println(obj1.Book(10,20)) // true
fmt.Println(obj1)
// myCalendar.book(15, 25); // return False, It can not be booked because time 15 is already booked by another event.
fmt.Println(obj1.Book(15,25)) // false
fmt.Println(obj1)
// myCalendar.book(20, 30); // return True, The event can be booked, as the first event takes every time less than 20, but not including 20.
fmt.Println(obj1.Book(20,30)) // false
fmt.Println(obj1)
fmt.Println(obj1.Book(5,18)) // false
fmt.Println(obj1)
}