-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathLEETCODE_LFU_Cache_460.py
111 lines (90 loc) · 2.13 KB
/
LEETCODE_LFU_Cache_460.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
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
#!/usr/bin/env python3
## Leetcode 460. LFU Cache
class ListNode:
def __init__(self, key=0, val=0, freq = 0, prev=None, next=None):
self.key = key
self.val = val
self.freq = freq
self.prev = prev
self.next = next
class LFUCache:
def __init__(self, capacity: int):
self.cap = capacity
self.lo = 0
self.mp = {}
self.freq = []
def _remove(self, node):
if self.lo == node.freq and self.freq[node.freq] == (node.prev, node.next): self.lo += 1
node.next.prev = node.prev
node.prev.next = node.next
self.mp.pop(node.key)
def _insert(self, node):
if node.freq == len(self.freq):
head = ListNode()
tail = ListNode()
head.next = tail
tail.prev = head
self.freq.append((head, tail))
head = self.freq[node.freq][0]
"""
# METHOD 1
node.next = head.next
node.prev = head
head.next.prev = head.next = node
"""
#self.mp[node.key] = node
##################################################################
"""
# METHOD 2
temp = head.next ## or tail
head.next = node
node.prev = head
node.next = temp
temp.prev = node
"""
# METHOD 3
tail = head.next ### REVERSE
node.prev = tail.prev
node.next = tail
tail.prev.next = tail.prev = node
"""
# METHOD 4
tail = head.next ### REVERSE
temp = tail.prev ## or head
tail.prev = node
node.next = tail
node.prev = temp
temp.next = node
"""
self.mp[node.key] = node
def get(self, key: int) -> int:
if key not in self.mp: return -1
node = self.mp[key]
self._remove(node)
node.freq += 1
self._insert(node)
return node.val
def put(self, key: int, value: int) -> None:
if self.get(key) == -1:
if self.cap == 0 and self.freq:
self.cap += 1
node = self.freq[self.lo][1].prev
self._remove(node)
if self.cap:
self.cap -= 1
node = ListNode(key, value)
self._insert(node)
self.lo = 0
else:
node = self.mp[key]
node.val = value
cache = LFUCache(2)
cache.put(1, 1)
cache.put(2, 2)
print(cache.get(1))
cache.put(3, 3)
print(cache.get(2))
cache.put(4, 4)
print(cache.get(1))
print(cache.get(3))
print(cache.get(4))