Skip to content

Navigation Menu

Sign in
Appearance settings

Search code, repositories, users, issues, pull requests...

Provide feedback

We read every piece of feedback, and take your input very seriously.

Saved searches

Use saved searches to filter your results more quickly

Sign up
Appearance settings

Commit a1bb5d2

Browse files
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)

AltStyle によって変換されたページ (->オリジナル) /