146. LRU Cache
来源:互联网 发布:mac dota2 编辑:程序博客网 时间:2024/05/17 08:09
Design and implement a data structure for Least Recently Used (LRU) cache. It should support the following operations: get
and put
.
get(key)
- Get the value (will always be positive) of the key if the key exists in the cache, otherwise return -1.put(key, value)
- Set or insert the value if the key is not already present. When the cache reached its capacity, it should invalidate the least recently used item before inserting a new item.
Follow up:
Could you do both operations in O(1) time complexity?
Example:
LRUCache cache = new LRUCache( 2 /* capacity */ );cache.put(1, 1);cache.put(2, 2);cache.get(1); // returns 1cache.put(3, 3); // evicts key 2cache.get(2); // returns -1 (not found)cache.put(4, 4); // evicts key 1cache.get(1); // returns -1 (not found)cache.get(3); // returns 3cache.get(4); // returns 4这里要删除的,是最久远没有操作过的数,统计访问次数的方法最坏结果是O(n),所以要用双向链表才能设计出O(1)的解法。设计一个node,包含key,value,pre,和next。每次操作时,把这个node放在最前面;超过容量的时候,删除尾巴的节点。为了准确根据key定位node,还需要建立一个key和node的map。代码如下:
public class LRUCache { class LRUNode { int key, value; LRUNode pre, next; public LRUNode(int _key, int _value) { key = _key; value = _value; } } HashMap<Integer, LRUNode> map; LRUNode head, tail; int capacity; public LRUCache(int capacity) { map = new HashMap<Integer, LRUNode>(); head = new LRUNode(0, 0); tail = new LRUNode(0, 0); head.next = tail; tail.pre = head; this.capacity = capacity; } private void addToHead(LRUNode node) { node.pre = head; node.next = head.next; head.next.pre = node; head.next = node; } private void deleteNode(LRUNode node) { node.pre.next = node.next; node.next.pre = node.pre; } public int get(int key) { if (map.containsKey(key)) { LRUNode node = map.get(key); int result = node.value; deleteNode(node); addToHead(node); return result; } return -1; } public void put(int key, int value) { if (map.containsKey(key)) { LRUNode node = map.get(key); node.value = value; deleteNode(node); addToHead(node); } else { LRUNode node = new LRUNode(key, value); map.put(key, node); addToHead(node); if (map.size() > capacity) { int nodeKey = tail.pre.key; deleteNode(tail.pre); map.remove(nodeKey); } } }}/** * Your LRUCache object will be instantiated and called as such: * LRUCache obj = new LRUCache(capacity); * int param_1 = obj.get(key); * obj.put(key,value); */
阅读全文
0 0
- LeetCode 146. LRU Cache
- [leetcode] 146.LRU Cache
- 146. LRU Cache
- leetcode 146. LRU Cache
- Leetcode 146. LRU Cache
- Leetcode - 146. LRU Cache
- Leetcode 146. LRU Cache
- [leetcode] 146. LRU Cache
- Leetcode 146. LRU Cache
- leetcode 146. LRU Cache
- LeetCode-146. LRU Cache
- LeetCode 146. LRU Cache
- 146. LRU Cache
- LeetCode 146. LRU Cache
- 146. LRU Cache
- 146. LRU Cache
- 146. LRU Cache
- 146. LRU Cache
- 毕业两年后的总结
- sh ndk-build.cmd command not found
- 【bzoj1066】[SCOI2007]蜥蜴
- c++,matlab批量重命名文件/文件夹
- MATLAB实现K-means算法
- 146. LRU Cache
- 1000. 函数求值
- Linux 下的文件系统
- 用原生js写滚动条
- MATLAB颜色的使用
- SQL数据库基本操作
- TapTap遭App Store下架 苹果热更新海啸来袭
- 在Intellij Idea创建部署第一个web项目(入门)
- Convert a Binary Tree to Doubly Linked List