牛客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缓存结构详解的主要内容,如果未能解决你的问题,请参考以下文章

设计LRU缓存结构(NC93/考察次数Top3/难度中等)

牛客Top200---括号序列(java详解)

牛客Top200---大数加法(java详解)

牛客Top200---最长无重复子数组(java详解)

牛客Top200---链表相加(java详解)

牛客Top200---接雨水问题(java详解)