-
-
Notifications
You must be signed in to change notification settings - Fork 5
/
Copy pathnode.py
89 lines (75 loc) · 2.51 KB
/
node.py
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
class Node:
def __init__(self, val):
self.val = val
self.next = None
self.prev = None
self.st = set()
class AllOne:
def __init__(self):
self.head = Node(0)
self.tail = Node(0)
self.head.next = self.tail
self.tail.prev = self.head
self.dct = {}
def add_prev(self, node, key):
if node.val-1 != node.prev.val:
new = Node(node.val - 1)
new.prev, new.next = node, node.next
new.prev.next = new.next.prev = new
else:
new = node.prev
new.st.add(key)
return new
def add_next(self, node, key):
if node.val+1 != node.next.val:
new = Node(node.val + 1)
new.prev, new.next = node, node.next
new.prev.next = new.next.prev = new
else:
new = node.next
new.st.add(key)
return new
def inc(self, key: str) -> None:
"""
Inserts a new key <Key> with value 1. Or increments an existing key by 1.
"""
if key not in self.dct:
self.dct[key] = self.add_next(self.head, key)
else:
node = self.dct[key]
self.dct[key] = self.add_next(node,key)
node.st.remove(key)
if not node.st:
node.prev.next, node.next.prev = node.next, node.prev
def dec(self, key: str) -> None:
"""
Decrements an existing key by 1. If Key's value is 1, remove it from the data structure.
"""
if key in self.dct:
node = self.dct[key]
node.st.remove(key)
del self.dct[key]
if node.val > 1:
self.dct[key] = self.add_prev(node, key)
if not node.st:
node.prev.next, node.next.prev = node.next, node.prev
def getMaxKey(self) -> str:
"""
Returns one of the keys with maximal value.
"""
if not self.tail.prev.st:
return ""
return next(iter(self.tail.prev.st))
def getMinKey(self) -> str:
"""
Returns one of the keys with Minimal value.
"""
if not self.head.next.st:
return ""
return next(iter(self.head.next.st))
# Your AllOne object will be instantiated and called as such:
# obj = AllOne()
# obj.inc(key)
# obj.dec(key)
# param_3 = obj.getMaxKey()
# param_4 = obj.getMinKey()