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 ...
随机推荐
- 【SPSS】软件介绍
SPSS软件是美国斯坦福大学三位学生1968年研制开发的统计软件,SPSS是Statistical Package for Social Science(社会科学软件统计包)的缩写,2000年SPSS ...
- mysql的常用函数、流程控制
case when用法: END END if用法 IF(expr1,expr2,expr3) #表达式expr1为真则返回expr2否则为expr3 , , ) #结果: 1 ifnull用法: I ...
- A链接IE6、7下失效场景及解决方案
1.当img元素包含在多个层级关系里时,只要触发了img元素的父元素的hasLayout,那么就会造成在IE6\7下A标签失效. <!DOCTYPE html PUBLIC "-//W ...
- (转)J2EE十三个技术规范
从事Java开发的童鞋都知道,java是一种非常棒的语言,能够实现跨平台运行.它屏蔽了具体的平台环境的要求,也就是说,无论是windows,还是Unix.Linux系统,只要支持Java虚拟机,就可以 ...
- lr如何获取当前系统时间戳
lr如何获取当前系统时间戳 一般使用time函数,获取当前unix时间戳 lr程序如下: int t1; char a[20]; t1=time();//获取当前系统时间 //根据不同情况,将时间存储 ...
- 用户研究Q&A(1)
近来,不少同事开始认同用户研究的价值,希望通过接触,理解和研究用户来获取提升产品的有效信息.这绝对是件好事,因为我一直抱持的理念是,研究并不是藏在实验室或者握在少部分人手中的稀罕货,更重要是一种理念和 ...
- lua 代码加密方案
require 实现 require函数在实现上是依次调用package.searchers(lua51中是package.loaders)中的载入函数,成功后返回.在loadlib.c文件里有四个载 ...
- servlet下根据相对路径找资源
1.在web项目中如果直接添加一个资源,那么相对路径相对的是tomcat的bin目录. 2.在包中直接指定资源,那么可以使用以下的相对路径直接获取资源: InputStream in = this.g ...
- 利用Aspose.BarCode生成条码
生成条码有很多控件,大部分好的控件,做出来的条码精确清晰,但是往往该部分的控件费用都很高,这里推荐大家使用6.0版本的破解版,可以生成无水印,下方也可以不显示文字. 1.下图是 onbarcode 控 ...
- android自带theme
在网上搜了一下,android自带theme如下: •android:theme="@android:style/Theme.Dialog" 将一个Activity显示为对话框 ...