LeetCode-146- LRU 快取機制

雄獅虎豹發表於2022-01-28

LRU 快取機制

題目描述:運用你所掌握的資料結構,設計和實現一個 LRU (最近最少使用) 快取機制 。
實現 LRUCache 類:

  • LRUCache(int capacity) 以正整數作為容量 capacity 初始化 LRU 快取
  • int get(int key) 如果關鍵字 key 存在於快取中,則返回關鍵字的值,否則返回 -1 。
  • void put(int key, int value) 如果關鍵字已經存在,則變更其資料值;如果關鍵字不存在,則插入該組「關鍵字-值」。當快取容量達到上限時,它應該在寫入新資料之前刪除最久未使用的資料值,從而為新的資料值留出空間。

進階:你是否可以在 O(1) 時間複雜度內完成這兩種操作?

示例說明請見LeetCode官網。

來源:力扣(LeetCode)
連結:https://leetcode-cn.com/probl...
著作權歸領釦網路所有。商業轉載請聯絡官方授權,非商業轉載請註明出處。

解法一:LinkedHashMap
因為允許使用已有的資料結構,LinkedHashMap就支援,所以直接繼承LinkedHashMap即可,當然這是偷懶的做法,如果瞭解LinkedHashMap的實現的話,照著實現就可以了。
import java.util.LinkedHashMap;
import java.util.Map;

public class LeetCode_146 {
    public static void main(String[] args) {
        // 測試用例
        LRUCache lRUCache = new LRUCache(2);
        lRUCache.put(1, 1); // 快取是 {1=1}
        lRUCache.put(2, 2); // 快取是 {1=1, 2=2}
        lRUCache.get(1);    // 返回 1
        lRUCache.put(3, 3); // 該操作會使得關鍵字 2 作廢,快取是 {1=1, 3=3}
        lRUCache.get(2);    // 返回 -1 (未找到)
        lRUCache.put(4, 4); // 該操作會使得關鍵字 1 作廢,快取是 {4=4, 3=3}
        lRUCache.get(1);    // 返回 -1 (未找到)
        lRUCache.get(3);    // 返回 3
        lRUCache.get(4);    // 返回 4
    }
}

class LRUCache extends LinkedHashMap<Integer, Integer> {
    private int capacity;

    public LRUCache(int capacity) {
        super(capacity, 0.75F, true);
        this.capacity = capacity;
    }

    public int get(int key) {
        return super.getOrDefault(key, -1);
    }

    public void put(int key, int value) {
        super.put(key, value);
    }

    /**
     * 移除最久未使用的資料的條件:當快取容量達到上線
     *
     * @param eldest
     * @return
     */
    @Override
    protected boolean removeEldestEntry(Map.Entry<Integer, Integer> eldest) {
        return size() > capacity;
    }
}
【每日寄語】 也許奮鬥了一輩子的屌絲也只是個屌絲,也許鹹魚翻身了不過是一個翻了面的鹹魚,但至少我們有做夢的自尊,而不是丟下一句‘努力無用’心安理得地生活下去。

相關文章