牛客Top200 --- 设计LRU缓存结构详解
Posted 小样5411
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了牛客Top200 --- 设计LRU缓存结构详解相关的知识,希望对你有一定的参考价值。
题目
import java.util.*;
public class Solution {
public static void main(String[] args) {
int[][] arr = new int[][]{{1,1,1},{1,2,2},{1,3,2},{2,1},{1,4,4},{2,2}};
int[] lruArr = LRU(arr, 3);
System.out.println(Arrays.toString(lruArr));
System.out.println("---------------------");
int[][] arr1 = new int[][]{{1,1,1},{1,2,2},{2,1},{1,3,3},{2,2},{1,4,4},{2,1},{2,3},{2,4}};
int[] lruArr1 = LRU(arr1, 2);
System.out.println(Arrays.toString(lruArr1));
}
public static int[] LRU (int[][] operators, int k){
ArrayList<Integer> tmpResult=new ArrayList<>();//有序,适合查询
Map<Integer,Integer> map=new HashMap<>();//hash散列无序
LinkedList<Integer> list=new LinkedList<>();//有序,适合增删,自带remove方法,remove等同于removeFirst,删第一个
for(int i=0;i<operators.length;i++){
//判断opt=1还是等于2
if(operators[i][0]==1){
//是否达到阈值k
if(list.size()==k){
map.remove(list.removeFirst());
}
//未达到k个,则可以添加,将(key,value)进行put,并且list记录key
//list用于存放最久没动过的元素,排在最前就是最久没用过
map.put(operators[i][1],operators[i][2]);
list.add(operators[i][1]);
}else{
//opt=2,则按题目中要求,获取对应的key,没有对应的key,就默认返回-1,刚好map中有这个方法
tmpResult.add(map.getOrDefault(operators[i][1],-1));
//若可以get到,即有对应的key,那么相当于就get使用了一次,那么热度提升,就不在最前面
if(map.containsKey(operators[i][1])){
list.remove(new Integer(operators[i][1]));//删除排在最前的operators[i][1],即最不常用,注意list内是Integer类型
list.add(new Integer(operators[i][1]));
}
}
}
//tmp存的结果,赋值给数组返回
int[] res=new int[tmpResult.size()];
for(int i=0;i<tmpResult.size();i++){
res[i]=tmpResult.get(i);
}
return res;
}
}
输出
主要是int[] LRU (int[][] operators, int k)
方法,测试通过
以上是关于牛客Top200 --- 设计LRU缓存结构详解的主要内容,如果未能解决你的问题,请参考以下文章