Skip to content

Commit 7ac9488

Browse files
authored
Update All O`one Data Structure.py
1 parent dff0ba5 commit 7ac9488

File tree

1 file changed

+71
-77
lines changed

1 file changed

+71
-77
lines changed

All O`one Data Structure.py

+71-77
Original file line numberDiff line numberDiff line change
@@ -9,109 +9,103 @@
99
Challenge: Perform all these in O(1) time complexity.
1010
'''
1111

12-
class AllOne(object):
12+
class Node:
13+
def __init__(self, key='', val=0):
14+
self.key = key
15+
self.val = val
16+
self.prev = None
17+
self.next = None
18+
19+
class AllOne:
1320

1421
def __init__(self):
1522
"""
1623
Initialize your data structure here.
1724
"""
18-
self.kv = {}
19-
self.maxk = ''
20-
self.maxv = float('-inf')
21-
self.mink = ''
22-
self.minv = float('inf')
25+
# key to node
26+
self.dic = {}
2327

24-
def inc(self, key):
28+
self.head = Node(key='head', val=float('-inf'))
29+
self.tail = Node(key='tail', val=float('inf'))
30+
self.head.next = self.tail
31+
self.tail.prev = self.head
32+
33+
def inc(self, key: str) -> None:
2534
"""
2635
Inserts a new key <Key> with value 1. Or increments an existing key by 1.
27-
:type key: str
28-
:rtype: void
2936
"""
30-
if key in self.kv:
31-
self.kv[key] += 1
37+
if key not in self.dic:
38+
self.dic[key] = Node(key=key, val=1)
39+
self.addLink(self.dic[key], self.head)
3240
else:
33-
self.kv[key] = 1
41+
self.dic[key].val += 1
42+
prev = self.dic[key].prev
43+
self.removeLink(self.dic[key])
44+
while prev.val < self.dic[key].val:
45+
prev = prev.next
3446

35-
if self.mink == key:
36-
self.mink = ''
37-
self.minv = float('inf')
38-
elif self.minv > self.kv[key]:
39-
self.mink = key
40-
self.minv = self.kv[key]
47+
self.addLink(self.dic[key], prev.prev)
48+
49+
# self.display('-----inc {}'.format(key))
50+
4151

42-
if self.maxv < self.kv[key]:
43-
self.maxk = key
44-
self.maxv = self.kv[key]
45-
46-
def dec(self, key):
52+
def dec(self, key: str) -> None:
4753
"""
4854
Decrements an existing key by 1. If Key's value is 1, remove it from the data structure.
49-
:type key: str
50-
:rtype: void
5155
"""
56+
if key not in self.dic:
57+
return
5258

53-
if key in self.kv:
54-
self.kv[key] -= 1
55-
if self.kv[key] == 0:
56-
del self.kv[key]
57-
58-
if self.maxk == key:
59-
self.maxk = ''
60-
self.maxv = float('-inf')
61-
if self.mink == key:
62-
self.mink = ''
63-
self.minv = float('inf')
64-
else:
65-
if self.maxk == key:
66-
self.maxk = ''
67-
self.maxv = float('-inf')
68-
elif self.maxv < self.kv[key]:
69-
self.maxk = key
70-
self.maxv = self.kv[key]
71-
72-
if self.minv > self.kv[key]:
73-
self.mink = key
74-
self.minv = self.kv[key]
59+
self.dic[key].val -= 1
60+
if self.dic[key].val == 0:
61+
self.removeLink(self.dic[key])
62+
del self.dic[key]
63+
else:
64+
next = self.dic[key].next
65+
self.removeLink(self.dic[key])
66+
while self.dic[key].val < next.val:
67+
next = next.prev
68+
self.addLink(self.dic[key], next)
7569

76-
def getMaxKey(self):
70+
# self.display('-----dec {}'.format(key))
71+
72+
def getMaxKey(self) -> str:
7773
"""
7874
Returns one of the keys with maximal value.
79-
:rtype: str
8075
"""
81-
if self.maxk:
82-
return self.maxk
83-
else:
84-
if self.kv:
85-
for k, v in self.kv.iteritems():
86-
if v > self.maxv:
87-
self.maxk = k
88-
self.maxv = v
89-
return self.maxk
90-
else:
91-
return ''
76+
if self.head.next == self.tail:
77+
return ''
78+
return self.tail.prev.key
9279

93-
94-
def getMinKey(self):
80+
def getMinKey(self) -> str:
9581
"""
9682
Returns one of the keys with Minimal value.
97-
:rtype: str
9883
"""
99-
if self.mink:
100-
return self.mink
101-
else:
102-
if self.kv:
103-
for k, v in self.kv.iteritems():
104-
if v < self.minv:
105-
self.mink = k
106-
self.minv = v
107-
return self.mink
108-
else:
109-
return ''
110-
84+
if self.head.next == self.tail:
85+
return ''
86+
return self.head.next.key
11187

88+
def addLink(self, node: Node, prev: Node) -> None:
89+
next = prev.next
90+
91+
node.prev = prev
92+
node.next = next
93+
prev.next = node
94+
next.prev = node
95+
96+
def removeLink(self, node: Node) -> None:
97+
prev = node.prev
98+
next = node.next
99+
prev.next = next
100+
next.prev = prev
101+
102+
def display(self, s: str) -> None:
103+
print(s)
104+
node = self.head.next
105+
while node != self.tail:
106+
print(node.key, node.val)
107+
node = node.next
112108

113-
114-
115109
# Your AllOne object will be instantiated and called as such:
116110
# obj = AllOne()
117111
# obj.inc(key)

0 commit comments

Comments
 (0)