LeetCode Notes_#146 LRU快取機制
阿新 • • 發佈:2021-01-08
LeetCode Notes_#146 LRU快取機制
LeetCodeContents
題目
解答
方法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
待更新