1. 程式人生 > 實用技巧 >LeetCode Notes_#146 LRU快取機制

LeetCode Notes_#146 LRU快取機制

LeetCode Notes_#146 LRU快取機制

LeetCode

Contents

題目


解答

方法1

感覺這個題目挺有意思,我用HashMap實現了一個基本的解法,能通過除了一個大資料輸入用例的其他所有用例,說明邏輯上是沒有問題的。但是需要優化時間複雜度。

class LRUCache {
    HashMap<Integer, Integer> container;
    HashMap<Integer, Integer> noVisitTimes;
    int cap;
    int
longestNoUseKey; public LRUCache(int capacity) { container = new HashMap<>(); noVisitTimes = new HashMap<>(); cap = capacity; longestNoUseKey = -1; } public int get(int key) { if(container.size() == 0) return -1; for(Integer k: container.keySet()){ if
(k == key) noVisitTimes.put(key, 0); else noVisitTimes.put(k, noVisitTimes.getOrDefault(k, 0) + 1); } if(container.containsKey(key)) return container.get(key); return -1; } public void put(int key, int value) { for(Integer k: container.keySet()){ if
(k == key) noVisitTimes.put(key, 0); else noVisitTimes.put(k, noVisitTimes.getOrDefault(k, 0) + 1); } if(container.containsKey(key)){ container.put(key, value); }else{ if(container.size() < cap){ container.put(key, value); }else{ int maxNoUseTimes = -1; for(Integer k: noVisitTimes.keySet()){ if(noVisitTimes.get(k) > maxNoUseTimes){ maxNoUseTimes = noVisitTimes.get(k); longestNoUseKey = k; } } container.remove(longestNoUseKey); noVisitTimes.remove(longestNoUseKey); container.put(key, value); } } } }

複雜度分析

時間複雜度:對於get()put()的操作,每次都需要遍歷一遍大小為container.size()hashmap,複雜度為O(n),n為container.size()
空間複雜度:O(n),藉助了一個額外的noVisitTimes的hashmap,大小和container相同

方法2

待更新