Leetcode- LRUCache
来源:互联网 发布:数据正规化 编辑:程序博客网 时间:2024/06/14 22:01
关键是搞懂题目(不知道LRUCache的只能自己google了)。
然后用双向链表来模拟cache被get和set。但是naive implementation会exceed time limit。所以最大的关键是用一个HashMap来记录key在链表中的位置,这样子每次查询是O(1)的时间,否则O(n)。
这个也是很经典的用Map来加速双向链表查询的思路(前提是key要唯一)。
import java.util.*;public class LRUCache {Map<Integer, DoubleLinkedListNode> hmap = new HashMap<Integer, DoubleLinkedListNode>();DoubleLinkedListNode head = null;DoubleLinkedListNode tail = null;int capa;public LRUCache(int capacity) {this.capa = capacity;}public int get(int key) {if (hmap.containsKey(key)) {DoubleLinkedListNode tnode = hmap.get(key);tnode = removeNode(tnode);pushFront(tnode);return tnode.value;}return -1;}public void set(int key, int value) {if (hmap.containsKey(key) == true) {DoubleLinkedListNode tnode = hmap.get(key);tnode.value = value;tnode = removeNode(tnode);pushFront(tnode);}else {DoubleLinkedListNode newNode = new DoubleLinkedListNode(key,value);if (hmap.size() == capa) {hmap.remove(tail.key);removeNode(tail);}pushFront(newNode);hmap.put(key, newNode);}}void pushFront(DoubleLinkedListNode node) {if (head == null) {head = tail = node;} else {node.next = head;head.prev = node;head = node;}return;}DoubleLinkedListNode removeNode(DoubleLinkedListNode node) {DoubleLinkedListNode prev = node.prev;DoubleLinkedListNode next = node.next;if (prev != null) {prev.next = next;} else {head = next;}if (next != null) {next.prev = prev;} else {tail = prev;}node.prev = null;node.next = null;return node;}class DoubleLinkedListNode {int key;int value;DoubleLinkedListNode prev;DoubleLinkedListNode next;public DoubleLinkedListNode(int key, int val) {this.key = key;this.value = val;prev = null;next = null;}public DoubleLinkedListNode() {value = 0;prev = null;next = null;}}}
0 0
- leetcode LRUCache
- Leetcode- LRUCache
- LRUCache---leetcode
- LeetCode刷题笔录LRUCache
- LeetCode 146 LRUCache Python题解
- LRUCache
- LruCache
- LRUCache
- LruCache
- LRUCache
- LRUCache
- LruCache
- LRUCache
- LRUCache
- LRUCache
- LRUCache
- Lrucache
- lruCache
- yum源配置
- hdu4607——Park Visit
- C#中属性和字段的区别
- ios app发布证书和流程
- uva 11402 Ahoy, Pirates!(线段树,lazy propagation)
- Leetcode- LRUCache
- vim php tab 补全提示
- 如何写Makefile(一)
- Android 文本输入框 获取焦点和设置光标到末尾
- NSDictionary和NSData之间的相互转换
- 重庆一中Vijos 【训练题】花店橱窗布置 P1426
- UVa 10773 - Back to Intermediate Math
- POJ1258 Agri-Net 【最小生成树Prim】
- 八爱贸易有限公司