Location via proxy:   [ UP ]  
[Report a bug]   [Manage cookies]                
Skip to content

Commit a1bb5d2

Browse files
committed
Time: 72 ms (98.19%), Space: 136.2 MB (83.61%) - LeetHub
1 parent d43e328 commit a1bb5d2

File tree

1 file changed

+80
-0
lines changed

1 file changed

+80
-0
lines changed

0146-lru-cache/0146-lru-cache.kt

Lines changed: 80 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,80 @@
1+
class LinkedNode(
2+
val key: Int,
3+
var value: Int,
4+
var prev: LinkedNode?,
5+
var next: LinkedNode?,
6+
)
7+
8+
class LRUCache(private val capacity: Int) {
9+
private val pointerByKey = hashMapOf<Int, LinkedNode>()
10+
private var lruKey: LinkedNode? = null // head
11+
private var mruKey: LinkedNode? = null // tail
12+
private var size = 0
13+
14+
fun get(key: Int): Int {
15+
val node = pointerByKey[key]
16+
node ?: return -1
17+
18+
val value = node.value
19+
20+
// pointer comparison
21+
if (node !== mruKey) {
22+
node.prev?.next = node.next
23+
node.next?.prev = node.prev
24+
if (node === lruKey) {
25+
lruKey = node.next
26+
}
27+
28+
mruKey!!.next = node
29+
node.prev = mruKey
30+
node.next = null
31+
mruKey = node
32+
}
33+
34+
return value
35+
}
36+
37+
fun put(key: Int, value: Int) {
38+
val cached = get(key)
39+
if (cached != -1) {
40+
mruKey!!.value = value
41+
return
42+
}
43+
44+
if (size == capacity) {
45+
val removed = lruKey!!
46+
val newLruKey = removed.next
47+
48+
pointerByKey.remove(removed.key)
49+
50+
removed.next = null
51+
newLruKey?.prev = null
52+
53+
lruKey = newLruKey
54+
} else {
55+
++size
56+
}
57+
58+
val newNode = LinkedNode(
59+
key = key,
60+
value = value,
61+
prev = mruKey,
62+
next = null,
63+
)
64+
pointerByKey[key] = newNode
65+
66+
if (lruKey == null) {
67+
lruKey = newNode
68+
}
69+
70+
mruKey?.next = newNode
71+
mruKey = newNode
72+
}
73+
}
74+
75+
/**
76+
* Your LRUCache object will be instantiated and called as such:
77+
* var obj = LRUCache(capacity)
78+
* var param_1 = obj.get(key)
79+
* obj.put(key,value)
80+
*/

0 commit comments

Comments
 (0)