|
9 | 9 | Challenge: Perform all these in O(1) time complexity.
|
10 | 10 | '''
|
11 | 11 |
|
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: |
13 | 20 |
|
14 | 21 | def __init__(self):
|
15 | 22 | """
|
16 | 23 | Initialize your data structure here.
|
17 | 24 | """
|
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 = {} |
23 | 27 |
|
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: |
25 | 34 | """
|
26 | 35 | Inserts a new key <Key> with value 1. Or increments an existing key by 1.
|
27 |
| - :type key: str |
28 |
| - :rtype: void |
29 | 36 | """
|
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) |
32 | 40 | 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 |
34 | 46 |
|
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 | + |
41 | 51 |
|
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: |
47 | 53 | """
|
48 | 54 | 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 |
51 | 55 | """
|
| 56 | + if key not in self.dic: |
| 57 | + return |
52 | 58 |
|
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) |
75 | 69 |
|
76 |
| - def getMaxKey(self): |
| 70 | + # self.display('-----dec {}'.format(key)) |
| 71 | + |
| 72 | + def getMaxKey(self) -> str: |
77 | 73 | """
|
78 | 74 | Returns one of the keys with maximal value.
|
79 |
| - :rtype: str |
80 | 75 | """
|
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 |
92 | 79 |
|
93 |
| - |
94 |
| - def getMinKey(self): |
| 80 | + def getMinKey(self) -> str: |
95 | 81 | """
|
96 | 82 | Returns one of the keys with Minimal value.
|
97 |
| - :rtype: str |
98 | 83 | """
|
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 |
111 | 87 |
|
| 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 |
112 | 108 |
|
113 |
| - |
114 |
| - |
115 | 109 | # Your AllOne object will be instantiated and called as such:
|
116 | 110 | # obj = AllOne()
|
117 | 111 | # obj.inc(key)
|
|
0 commit comments