Leetcode 146. LRU Cache
2 min readMay 6, 2021
[medium][Amazon]
Design a data structure that follows the constraints of a Least Recently Used (LRU) cache.
Implement the LRUCache
class:
LRUCache(int capacity)
Initialize the LRU cache with positive sizecapacity
.int get(int key)
Return the value of thekey
if the key exists, otherwise return-1
.void put(int key, int value)
Update the value of thekey
if thekey
exists. Otherwise, add thekey-value
pair to the cache. If the number of keys exceeds thecapacity
from this operation, evict the least recently used key.
Follow up:
Could you do get
and put
in O(1)
time complexity?
Example 1:
Input
["LRUCache", "put", "put", "get", "put", "get", "put", "get", "get", "get"]
[[2], [1, 1], [2, 2], [1], [3, 3], [2], [4, 4], [1], [3], [4]]
Output
[null, null, null, 1, null, -1, null, -1, 3, 4]Explanation
LRUCache lRUCache = new LRUCache(2);
lRUCache.put(1, 1); // cache is {1=1}
lRUCache.put(2, 2); // cache is {1=1, 2=2}
lRUCache.get(1); // return 1
lRUCache.put(3, 3); // LRU key was 2, evicts key 2, cache is {1=1, 3=3}
lRUCache.get(2); // returns -1 (not found)
lRUCache.put(4, 4); // LRU key was 1, evicts key 1, cache is {4=4, 3=3}
lRUCache.get(1); // return -1 (not found)
lRUCache.get(3); // return 3
lRUCache.get(4); // return 4
Constraints:
1 <= capacity <= 3000
0 <= key <= 3000
0 <= value <= 104
- At most
3 * 104
calls will be made toget
andput
.
[Think]
- this is a system design question, have to create class, function and data structure.
- this question we want to create a double linkedlist, and apply two main function get and put.
- to do that, we have to create another four method for our double linkedlist node. addNode, removeNode, moreToHead, popTail.
- using hashtable to store key and doublelinkedNode — cache
- addNode — have to connect a new Node to head in both direction
- removeNode- have to create another DLinkedNode to skip the node
- moveToHead- removeNode and addNode
- popTail — get the tail.pre, and removeNode, return the popTail part
- capacity — create a data structire for capacity and default the setting for head and tail
- get — if we can find the key in hashtable- cache; moveToHead the node and return the node.value
- put — if the key already exist, we update the value and moveToHead; if we don’t have the key, create another newNode and add its key and value into cache.
- if the count > capacity, have to poptail and make sure have enought room for the newNode
[Note]
- I tried hard to understand the code — be patient
- pointer pre and post are very confuse, draw it on paper will help understand
- build a code structure first and it will help to find out what should do next
- it’s a good question for system deisgn — objected-oriented
- this — is what we are working on, so everytime want to call a function, have to make sure we adjust on “this”
- be careful for the typo on “DLinkedNode”
- Happy coding