Skip to content

Commit ac790ab

Browse files
authored
feat: add solutions to lc problem: No.0731 (doocs#3919)
No.0731.My Calendar II
1 parent 8380f3f commit ac790ab

16 files changed

+1053
-547
lines changed

solution/0700-0799/0731.My Calendar II/README.md

+339-180
Large diffs are not rendered by default.

solution/0700-0799/0731.My Calendar II/README_EN.md

+358-179
Large diffs are not rendered by default.
Original file line numberDiff line numberDiff line change
@@ -1,28 +1,29 @@
11
class MyCalendarTwo {
22
public:
3-
map<int, int> m;
4-
53
MyCalendarTwo() {
64
}
75

8-
bool book(int start, int end) {
9-
++m[start];
10-
--m[end];
6+
bool book(int startTime, int endTime) {
7+
++m[startTime];
8+
--m[endTime];
119
int s = 0;
1210
for (auto& [_, v] : m) {
1311
s += v;
1412
if (s > 2) {
15-
--m[start];
16-
++m[end];
13+
--m[startTime];
14+
++m[endTime];
1715
return false;
1816
}
1917
}
2018
return true;
2119
}
20+
21+
private:
22+
map<int, int> m;
2223
};
2324

2425
/**
2526
* Your MyCalendarTwo object will be instantiated and called as such:
2627
* MyCalendarTwo* obj = new MyCalendarTwo();
27-
* bool param_1 = obj->book(start,end);
28-
*/
28+
* bool param_1 = obj->book(startTime,endTime);
29+
*/
Original file line numberDiff line numberDiff line change
@@ -1,28 +1,30 @@
11
type MyCalendarTwo struct {
2-
*redblacktree.Tree
2+
rbt *redblacktree.Tree[int, int]
33
}
44

55
func Constructor() MyCalendarTwo {
6-
return MyCalendarTwo{redblacktree.NewWithIntComparator()}
6+
return MyCalendarTwo{rbt: redblacktree.New[int, int]()}
77
}
88

9-
func (this *MyCalendarTwo) Book(start int, end int) bool {
10-
add := func(key, val int) {
11-
if v, ok := this.Get(key); ok {
12-
this.Put(key, v.(int)+val)
9+
func (this *MyCalendarTwo) Book(startTime int, endTime int) bool {
10+
merge := func(x, v int) {
11+
c, _ := this.rbt.Get(x)
12+
if c+v == 0 {
13+
this.rbt.Remove(x)
1314
} else {
14-
this.Put(key, val)
15+
this.rbt.Put(x, c+v)
1516
}
1617
}
17-
add(start, 1)
18-
add(end, -1)
18+
19+
merge(startTime, 1)
20+
merge(endTime, -1)
21+
1922
s := 0
20-
it := this.Iterator()
21-
for it.Next() {
22-
s += it.Value().(int)
23+
for _, v := range this.rbt.Values() {
24+
s += v
2325
if s > 2 {
24-
add(start, -1)
25-
add(end, 1)
26+
merge(startTime, -1)
27+
merge(endTime, 1)
2628
return false
2729
}
2830
}
@@ -32,5 +34,5 @@ func (this *MyCalendarTwo) Book(start int, end int) bool {
3234
/**
3335
* Your MyCalendarTwo object will be instantiated and called as such:
3436
* obj := Constructor();
35-
* param_1 := obj.Book(start,end);
36-
*/
37+
* param_1 := obj.Book(startTime,endTime);
38+
*/
Original file line numberDiff line numberDiff line change
@@ -1,18 +1,18 @@
11
class MyCalendarTwo {
2-
private Map<Integer, Integer> tm = new TreeMap<>();
2+
private final Map<Integer, Integer> tm = new TreeMap<>();
33

44
public MyCalendarTwo() {
55
}
66

7-
public boolean book(int start, int end) {
8-
tm.put(start, tm.getOrDefault(start, 0) + 1);
9-
tm.put(end, tm.getOrDefault(end, 0) - 1);
7+
public boolean book(int startTime, int endTime) {
8+
tm.merge(startTime, 1, Integer::sum);
9+
tm.merge(endTime, -1, Integer::sum);
1010
int s = 0;
1111
for (int v : tm.values()) {
1212
s += v;
1313
if (s > 2) {
14-
tm.put(start, tm.get(start) - 1);
15-
tm.put(end, tm.get(end) + 1);
14+
tm.merge(startTime, -1, Integer::sum);
15+
tm.merge(endTime, 1, Integer::sum);
1616
return false;
1717
}
1818
}
@@ -23,5 +23,5 @@ public boolean book(int start, int end) {
2323
/**
2424
* Your MyCalendarTwo object will be instantiated and called as such:
2525
* MyCalendarTwo obj = new MyCalendarTwo();
26-
* boolean param_1 = obj.book(start,end);
27-
*/
26+
* boolean param_1 = obj.book(startTime,endTime);
27+
*/
Original file line numberDiff line numberDiff line change
@@ -1,32 +1,34 @@
11
var MyCalendarTwo = function () {
2-
this.events = [];
3-
this.overlaps = [];
2+
this.tm = {};
43
};
54

65
/**
7-
* @param {number} start
8-
* @param {number} end
6+
* @param {number} startTime
7+
* @param {number} endTime
98
* @return {boolean}
109
*/
11-
MyCalendarTwo.prototype.book = function (start, end) {
12-
for (let [s, e] of this.overlaps) {
13-
if (Math.max(start, s) < Math.min(end, e)) {
14-
return false;
15-
}
16-
}
10+
MyCalendarTwo.prototype.book = function (startTime, endTime) {
11+
this.tm[startTime] = (this.tm[startTime] || 0) + 1;
12+
this.tm[endTime] = (this.tm[endTime] || 0) - 1;
13+
let s = 0;
1714

18-
for (let [s, e] of this.events) {
19-
if (Math.max(start, s) < Math.min(end, e)) {
20-
this.overlaps.push([Math.max(start, s), Math.min(end, e)]);
15+
for (const v of Object.values(this.tm)) {
16+
s += v;
17+
if (s > 2) {
18+
if (--this.tm[startTime] === 0) {
19+
delete this.tm[startTime];
20+
}
21+
if (++this.tm[endTime] === 0) {
22+
delete this.tm[endTime];
23+
}
24+
return false;
2125
}
2226
}
23-
24-
this.events.push([start, end]);
2527
return true;
2628
};
2729

2830
/**
2931
* Your MyCalendarTwo object will be instantiated and called as such:
3032
* var obj = new MyCalendarTwo()
31-
* var param_1 = obj.book(start,end)
33+
* var param_1 = obj.book(startTime,endTime)
3234
*/

solution/0700-0799/0731.My Calendar II/Solution.py

+6-6
Original file line numberDiff line numberDiff line change
@@ -5,19 +5,19 @@ class MyCalendarTwo:
55
def __init__(self):
66
self.sd = SortedDict()
77

8-
def book(self, start: int, end: int) -> bool:
9-
self.sd[start] = self.sd.get(start, 0) + 1
10-
self.sd[end] = self.sd.get(end, 0) - 1
8+
def book(self, startTime: int, endTime: int) -> bool:
9+
self.sd[startTime] = self.sd.get(startTime, 0) + 1
10+
self.sd[endTime] = self.sd.get(endTime, 0) - 1
1111
s = 0
1212
for v in self.sd.values():
1313
s += v
1414
if s > 2:
15-
self.sd[start] -= 1
16-
self.sd[end] += 1
15+
self.sd[startTime] -= 1
16+
self.sd[endTime] += 1
1717
return False
1818
return True
1919

2020

2121
# Your MyCalendarTwo object will be instantiated and called as such:
2222
# obj = MyCalendarTwo()
23-
# param_1 = obj.book(start,end)
23+
# param_1 = obj.book(startTime,endTime)
Original file line numberDiff line numberDiff line change
@@ -1,32 +1,30 @@
11
class MyCalendarTwo {
2-
private events: [number, number][];
3-
private overlaps: [number, number][];
2+
private tm: Record<number, number> = {};
43

5-
constructor() {
6-
this.events = [];
7-
this.overlaps = [];
8-
}
4+
constructor() {}
95

10-
book(start: number, end: number): boolean {
11-
for (const [s, e] of this.overlaps) {
12-
if (Math.max(start, s) < Math.min(end, e)) {
6+
book(startTime: number, endTime: number): boolean {
7+
this.tm[startTime] = (this.tm[startTime] ?? 0) + 1;
8+
this.tm[endTime] = (this.tm[endTime] ?? 0) - 1;
9+
let s = 0;
10+
for (const v of Object.values(this.tm)) {
11+
s += v;
12+
if (s > 2) {
13+
if (--this.tm[startTime] === 0) {
14+
delete this.tm[startTime];
15+
}
16+
if (++this.tm[endTime] === 0) {
17+
delete this.tm[endTime];
18+
}
1319
return false;
1420
}
1521
}
16-
17-
for (const [s, e] of this.events) {
18-
if (Math.max(start, s) < Math.min(end, e)) {
19-
this.overlaps.push([Math.max(start, s), Math.min(end, e)]);
20-
}
21-
}
22-
23-
this.events.push([start, end]);
2422
return true;
2523
}
2624
}
2725

2826
/**
2927
* Your MyCalendarTwo object will be instantiated and called as such:
3028
* var obj = new MyCalendarTwo()
31-
* var param_1 = obj.book(start,end)
29+
* var param_1 = obj.book(startTime,endTime)
3230
*/

0 commit comments

Comments
 (0)