LRU缓存结构(算法)

思路:LRU(最近最少使用)当输入arr[][] = [[1,1,1],[1,2,2],[2,1],[1,3,4]]

其中二维数组a[x][0]代表操作,如[1,1,1] : set(1,1);[2,1] : get(1)

public int[] LRU(int [][]arrs, int k){
    
    //保存结果
   List<Integer> list = new LinkedList<>();
    //保存键值对
    Map<Integer,Integer> map = new LinkedHashMap<>();
    
    for(int arr:arrs){
        int key = arr[1];//获取键
        switch(arr[0]){//根据操作标志进行后续操作
            //进行set操作
            case 1:
                   int value = arr[2];//获取值
                   if(map.size()<k){//当存储大小大于设定大小
                       map.put(key,value);//存入
                   }else{//否则删除最早没使用的,再进行插入当前数值
                       Iterator it = map.keySet().iterator();
                       map.remove(it.next());
                       map.put(key,value);
                   }
                   break;
             //进行get操作
             case 2:
                   if(map.containsKey(key)){//当在map中存储了对应key
                       int val = map.get(key);//获取对应值
                       list.add(val);//存入list中
                       //将该key重新存储入map,相当于放在最前
                       map.remove(key);
                       map.put(key,val);
                   }else{
                       list.add(-1);//没对应值返回-1
                   }
                   break;
              deafult:
        }
         int res[] = new int[list.size()];//返回结果数组
         for(int i=0;i<res.length;i++){
             res[i] = list.get(i);
         }
         return res;
    }
}

 

posted @ 2022-01-10 17:02  Q子  阅读(45)  评论(0)    收藏  举报