My Calendar II LeetCode solution in Python

1
class Node:
2
def __init__(self, start, end, val):
3
self.start = start
4
self.end = end
5
self.val = val
6
self.left = None
7
self.right = None
8

9
def insertable(self, node):
10
if node.end <= node.start:
11
return True
12
if node.end <= self.start:
13
if not self.left:
14
return True
15
else:
16
return self.left.insertable(node)
17
elif node.start >= self.end:
18
if not self.right:
19
return True
20
else:
21
return self.right.insertable(node)
22
else:
23
if self.val == 1:
24
leftS = min(self.start, node.start)
25
leftE = max(self.start, node.start)
26
rightS = min(self.end, node.end)
27
rightE = max(self.end, node.end)
28
if not self.left and not self.right:
29
return True
30
elif not self.left:
31
return self.right.insertable(Node(rightS, rightE, 1))
32
elif not self.right:
33
return self.left.insertable(Node(leftS, leftE, 1))
34
else:
35
resL = self.left.insertable(Node(leftS, leftE, 1))
36
resR = self.right.insertable(Node(rightS, rightE, 1))
37
if resL and resR:
38
return True
39
return False
40
else:
41
return False
42

43
def insert(self, node):
44
if node.end <= node.start:
45
return
46

47
if node.end <= self.start:
48
if not self.left:
49
self.left = node
50
else:
51
self.left.insert(node)
52
elif node.start >= self.end:
53
if not self.right:
54
self.right = node
55
else:
56
self.right.insert(node)
57
else:
58
leftS = min(self.start, node.start)
59
leftE = max(self.start, node.start)
60
rightS = min(self.end, node.end)
61
rightE = max(self.end, node.end)
62
self.val += 1
63
self.start, self.end = leftE, rightS
64
if not self.left and not self.right:
65
self.left = Node(leftS, leftE, 1) if leftS < leftE else None
66
self.right = Node(rightS, rightE, 1) if rightS < rightE else None
67
elif not self.left:
68
self.left = Node(leftS, leftE, 1) if leftS < leftE else None
69
self.right.insert(Node(rightS, rightE, 1))
70
elif not self.right:
71
self.right = Node(rightS, rightE, 1) if rightS < rightE else None
72
self.left.insert(Node(leftS, leftE, 1))
73
else:
74
self.left.insert(Node(leftS, leftE, 1))
75
self.right.insert(Node(rightS, rightE, 1))
76
return
77

78

79
class MyCalendarTwo:
80

81
def __init__(self):
82
self.root = None
83

84
def book(self, start: int, end: int) -> bool:
85
if not self.root:
86
self.root = Node(start, end, 1)
87
return True
88
else:
89
newNode = Node(start, end, 1)
90
if self.root.insertable(newNode):
91
self.root.insert(newNode)
92
return True
93
return False

0

WPM •0 •0

100%

ACC •0 •0

0s

TIME •0