Skip to content

Navigation Menu

Sign in
Appearance settings

Search code, repositories, users, issues, pull requests...

Provide feedback

We read every piece of feedback, and take your input very seriously.

Saved searches

Use saved searches to filter your results more quickly

Sign up
Appearance settings

Commit ac790ab

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

File tree

16 files changed

+1053
-547
lines changed

16 files changed

+1053
-547
lines changed

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

Lines changed: 339 additions & 180 deletions
Large diffs are not rendered by default.

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

Lines changed: 358 additions & 179 deletions
Large diffs are not rendered by default.
Lines changed: 10 additions & 9 deletions
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+
*/
Lines changed: 18 additions & 16 deletions
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+
*/
Lines changed: 8 additions & 8 deletions
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 finalMap<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+
*/
Lines changed: 18 additions & 16 deletions
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‎

Lines changed: 6 additions & 6 deletions
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)
Lines changed: 16 additions & 18 deletions
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)

AltStyle によって変換されたページ (->オリジナル) /