Leetcode: LRU Cache 解题报告
LRU Cache
get
and set
.get(key)
- Get the value (will always be positive) of the key if the key exists in the cache, otherwise return -1.set(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.
SOLUTION 1:
利用了JAVA 自带的LinkedHashMap ,其实这相当于作弊了,面试官不太可能会过。但是我们仍然可以练习一下如何使用LinkedHashMap.
同学们可以参考一下它的官方文档:
https://docs.oracle.com/javase/7/docs/api/java/util/LinkedHashMap.html#LinkedHashMap(int)
1. OverRide removeEldestEntry 函数,在Size达到最大值最,删除最长时间未访问的节点。
protected boolean removeEldestEntry(Map.Entry eldest) {
return size() > capacity;
}
2. 在Get/ Set的时候,都更新节点,即删除之,再添加之,这样它会作为最新的节点加到双向链表中。
package Algorithms.hash; import java.util.LinkedHashMap;
import java.util.Map; public class LRUCache2 {
public static void main(String[] strs) {
LRUCache2 lrc2 = new LRUCache2();
lrc2.set(,);
lrc2.set(,);
lrc2.set(,);
lrc2.set(,); System.out.println(lrc2.get());
} LinkedHashMap<Integer, Integer> map;
int capacity; public LRUCache2(final int capacity) {
// create a map.
map = new LinkedHashMap<Integer, Integer>(capacity) {
/**
*
*/
private static final long serialVersionUID = 1L; protected boolean removeEldestEntry(Map.Entry eldest) {
return size() > capacity;
}
};
this.capacity = capacity;
} public int get(int key) {
Integer ret = map.get(key);
if (ret == null) {
return -;
} else {
map.remove(key);
map.put(key, ret);
} return ret;
} public void set(int key, int value) {
map.remove(key);
map.put(key, value);
}
}
SOLUTION 2:
使用 HashMap+ 双向链表实现:
1. 如果需要移除老的节点,我们从头节点移除。
2. 如果某个节点被访问(SET/GET),将其移除并挂在双向链表的结尾。
3. 链表满了后,我们删除头节点。
4. 最近访问的节点在链尾。最久被访问的节点在链头。
package Algorithms.hash; import java.util.HashMap; public class LRUCache {
private class DLink {
DLink pre;
DLink next;
int val;
int key;
DLink(int key, int val) {
this.val = val;
this.key = key;
pre = null;
next = null;
}
} HashMap<Integer, DLink> map; DLink head;
DLink tail; int capacity; public void removeFist() {
removeNode(head.next);
} public void removeNode(DLink node) {
node.pre.next = node.next;
node.next.pre = node.pre;
} // add a node to the tail.
public void addToTail(DLink node) {
tail.pre.next = node; node.pre = tail.pre;
node.next = tail; tail.pre = node;
} public LRUCache(int capacity) {
map = new HashMap<Integer, DLink>(); // two dummy nodes. In that case, we can deal with them more conviencely.
head = new DLink(-1, -1);
tail = new DLink(-1, -1);
head.next = tail;
tail.pre = head; this.capacity = capacity;
} public int get(int key) {
if (map.get(key) == null) {
return -1;
} // update the node.
DLink node = map.get(key);
removeNode(node);
addToTail(node); return node.val;
} public void set(int key, int value) {
DLink node = map.get(key);
if (node == null) {
// create a node and add the key-node pair into the map.
node = new DLink(key, value);
map.put(key, node);
} else {
// update the value of the node.
node.val = value;
removeNode(node);
} addToTail(node); // if the LRU is full, just remove a node.
if (map.size() > capacity) {
map.remove(head.next.key);
removeFist();
}
}
}
请移步至主页君的GITHUB代码:
https://github.com/yuzhangcmu/LeetCode_algorithm/blob/master/hash/LRUCache.java
https://github.com/yuzhangcmu/LeetCode_algorithm/blob/master/hash/LRUCache2.java
Leetcode: LRU Cache 解题报告的更多相关文章
- 【LeetCode】146. LRU Cache 解题报告(Python)
作者: 负雪明烛 id: fuxuemingzhu 个人博客: http://fuxuemingzhu.cn/ 目录 题目描述 题目大意 解题方法 字典+双向链表 日期 题目地址:https://le ...
- LeetCode: Combination Sum 解题报告
Combination Sum Combination Sum Total Accepted: 25850 Total Submissions: 96391 My Submissions Questi ...
- 【LeetCode】LRU Cache 解决报告
插话:只写了几个连续的博客,博客排名不再是实际"远在千里之外"该.我们已经进入2一万内. 再接再厉.油! Design and implement a data structure ...
- [LeetCode] LRU Cache 最近最少使用页面置换缓存器
Design and implement a data structure for Least Recently Used (LRU) cache. It should support the fol ...
- [LeetCode]LRU Cache有个问题,求大神解答【已解决】
题目: Design and implement a data structure for Least Recently Used (LRU) cache. It should support the ...
- 【LeetCode】Permutations 解题报告
全排列问题.经常使用的排列生成算法有序数法.字典序法.换位法(Johnson(Johnson-Trotter).轮转法以及Shift cursor cursor* (Gao & Wang)法. ...
- LeetCode - Course Schedule 解题报告
以前从来没有写过解题报告,只是看到大肥羊河delta写过不少.最近想把写博客的节奏给带起来,所以就挑一个比较容易的题目练练手. 原题链接 https://leetcode.com/problems/c ...
- LeetCode:LRU Cache
题目大意:设计一个用于LRU cache算法的数据结构. 题目链接.关于LRU的基本知识可参考here 分析:为了保持cache的性能,使查找,插入,删除都有较高的性能,我们使用双向链表(std::l ...
- LeetCode——LRU Cache
Description: Design and implement a data structure for Least Recently Used (LRU) cache. It should su ...
随机推荐
- eclispe Missing artifact...
eclispe Missing artifact... CreateTime--2018年4月24日18:47:21 Author:Marydon 1.情景再现 eclipse pom.xml报错 ...
- Q1:Valid Parentheses
Question: Given a string containing just the characters '(', ')', '{', '}', '[' and ']', determine i ...
- 触发器学习笔记(:new,:old用法)
触发器学习笔记(:new,:old用法) 触发器是数据库发生某个操作时自动运行的一类的程序 用于保持数据的完整性或记录数据库操作信息方面 触发器不能够被直接调用,只能够 ...
- [CXF REST标准实战系列] 二、Spring4.0 整合 CXF3.0,实现测试接口(转)
转自:[CXF REST标准实战系列] 二.Spring4.0 整合 CXF3.0,实现测试接口 文章Points: 1.介绍RESTful架构风格 2.Spring配置CXF 3.三层初设计,实现W ...
- HDUOJ----1181 变形课
变形课 Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 131072/65536 K (Java/Others) Total Submi ...
- 越狱iphone在cydia下插件后出现exit safe mode肿么办小教程
http://bbs.app111.com/thread-318898-1-1.html 从简单的开始..最简单的点击状态栏会弹出来一个窗口,那窗口有三个选择请选择第二个,然后等待它重启,重启后还没消 ...
- eclipse修改文件编码
http://topic.csdn.net/u/20080724/14/428de399-790d-442a-8340-3a5fb6dcfcee.html[修改文件编码,假设JS] 在Eclips ...
- Linux命令-终止进程命令:pkill
killall是杀死所有进程,而pkill是按照进程名称杀死进程,可以达到杀死所有进程的目的,因为linux里面同名的进程是分主进程和子进程的. pkill - httpd 按名称强制杀死httpd进 ...
- PL SQL基本内容(原创)
本节介绍PL SQL的基本内容 本节所举示例数据来源oracle用户scott下的emp表和dept表,数据如下: 一.plsql简介: 1.概念:procedural language,过程化sql ...
- Python学习笔记011——内置函数exec()
1 描述 把一个字符串当成语句执行 exec() 执行储存在字符串或文件中的 Python 语句,相比于 eval() , exec() 可以执行更复杂的 Python 代码. exec函数和ev ...