描述
设计LRU(最近最少使用)缓存结构,该结构在构造时确定大小,假设大小为K,并有如下两个功能
1. set(key, value):将记录(key, value)插入该结构
2. get(key):返回key对应的value值
提示:
1.某个key的set或get操作一旦发生,认为这个key的记录成了最常使用的,然后都会刷新缓存。
2.当缓存的大小超过K时,移除最不经常使用的记录。
3.输入一个二维数组与K,二维数组每一维有2个或者3个数字,第1个数字为opt,第2,3个数字为key,value
? ?若opt=1,接下来两个整数key,?value,表示set(key,?value) ? ?若opt=2,接下来一个整数key,表示get(key),若key未出现过或已被移除,则返回-1 ? ?对于每个opt=2,输出一个答案
4.为了方便区分缓存里key与value,下面说明的缓存里key用""号包裹
进阶:你是否可以在O(1)的时间复杂度完成set和get操作
分析:插入的数据构建双向链表,新增的数据放在链表头,每次获取数据时,会将新操作的数据更新到链表头,当链表的长度大于设置值的时候,从链表尾删除数据。
import java.util.*;
class Solution {
/**
* lru design
* @param operators int整型二维数组 the ops
* @param k int整型 the k
* @return int整型一维数组
*/
public int[] LRU (int[][] operators, int k) {
// write code here
LRU<Integer, Integer> lru = new LRU<>(k);
List<Integer> res = new ArrayList<>();
for(int i=0;i<operators.length;i++){
int[] temp = operators[i];
if(temp.length == 3){
lru.put(temp[1], temp[2]);
}
if(temp.length == 2){
Integer result = lru.get(temp[1]) == null ? -1 : lru.get(temp[1]);
res.add(result);
}
}
int[] result = new int[res.size()];
for(int i=0;i<res.size();i++){
result[i] = res.get(i);
}
return result;
}
class LRU<K, V> extends LinkedHashMap<K, V> {
private int capacity;
public LRU(int capacity){
//这里设置为true后,大于设置值就会丢弃
super(16,0.75f,true);
this.capacity = capacity;
}
//重写该方法
public boolean removeEldestEntry(Map.Entry entry){
return this.size() > capacity;
}
}
}
|