設計LRU緩存結構


題目描述

設計LRU緩存結構,該結構在構造時確定大小,假設大小為K,並有如下兩個功能
  • set(key, value):將記錄(key, value)插入該結構
  • get(key):返回key對應的value值
[要求]
  1. set和get方法的時間復雜度為O(1)
  2. 某個key的set或get操作一旦發生,認為這個key的記錄成了最常使用的。
  3. 當緩存的大小超過K時,移除最不經常使用的記錄,即set或get最久遠的。
若opt=1,接下來兩個整數x, y,表示set(x, y)
若opt=2,接下來一個整數x,表示get(x),若x未出現過或已被移除,則返回-1
對於每個操作2,輸出一個答案
 
輸入:[[1,1,1],[1,2,2],[1,3,2],[2,1],[1,4,4],[2,2]],3
返回值:[1,-1]
 
說明:
第一次操作后:最常使用的記錄為("1", 1)
第二次操作后:最常使用的記錄為("2", 2),("1", 1)變為最不常用的
第三次操作后:最常使用的記錄為("3", 2),("1", 1)還是最不常用的
第四次操作后:最常用的記錄為("1", 1),("2", 2)變為最不常用的
第五次操作后:大小超過了3,所以移除此時最不常使用的記錄("2", 2),加入記錄("4", 4),並且為最常使用的記錄,然后("3", 2)變為最不常使用的記錄
 
解析:

二維數組中第0位即:[1,1,1],第一個1表示opt=1,要set(1,1),即要將(1,1)插入緩存
二維數組中第1為即:[1,2,2],第一個1表示opt=1,要set(2,2),即要將(2,2)插入緩存
二維數組中第2位即:[1,3,2],第一個1表示opt=1,要set(3,2),即要將(3,2)插入緩存
二維數組中第3位即:[2,1],第一個2表示opt=2,要get(1),即從緩存中查找key為1的值,前面已經插入了key=1,所以返回1,這個要保存到返回數組中
二維數組中第5位即:[2,2],第一個2表示opt=2,要get(2),即從緩存中查找key為2的值,由於緩存大小為3,所以前面插入的key=2已經被擠出緩存,所以返回結果為-1,這個要保存到返回數組中
所以輸出為[1,-1]

 
import java.util.*;


public 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
        Map<Integer,Integer> map = new LinkedHashMap<>();
        List<Integer> list = new LinkedList<>();
        for (int[] operator : operators){
//             System.out.println(Arrays.toString(operator));
            int key = operator[1];
            switch(operator[0]){
               // opt=1
                case 1:
                    int value = operator[2];
                    if (map.size() < k){
                        map.put(key,value);
                    }else {
                        // 當緩存的大小超過K時,移除最不經常使用的記錄,即set或get最久遠的
                        Iterator it = map.keySet().iterator();
                        map.remove(it.next());
                        map.put(key,value);
                    }
                    
                    break;
                // opt=2
                case 2:
                    if (map.containsKey(key)){
                        int val = map.get(key);
                        list.add(val);
                        map.remove(key);
                        map.put(key,val);
                    }else{
                        list.add(-1);
                    }
                    break;
                default:
            }
            
        }
        int[] res = new int[list.size()];
        
        int i = 0;
        for (int val : list){
            res[i++] = val;
            
        }
        return res;
    }
}

 

 
 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM