[Leetcode146]LRU快取機制
阿新 • • 發佈:2018-11-27
運用你所掌握的資料結構,設計和實現一個 LRU (最近最少使用) 快取機制。它應該支援以下操作: 獲取資料 get
和 寫入資料 put
。獲取資料 get(key)
- 如果金鑰 (key) 存在於快取中,則獲取金鑰的值(總是正數),否則返回 -1。 寫入資料 put(key, value)
- 如果金鑰不存在,則寫入其資料值。當快取容量達到上限時,它應該在寫入新資料之前刪除最近最少使用的資料值,從而為新的資料值留出空間。
python,我用了兩個列表分別表示key和value。
python:
class LRUCache(object): def __init__(self, capacity): """ :type capacity: int """ self.ind = [] self.val= [] self.n = capacity def get(self, key): """ :type key: int :rtype: int """ if key not in self.ind: return -1 index = self.ind.index(key) value = self.val[index] self.ind.pop(index) self.ind.append(key) self.val.pop(index) self.val.append(value) return value def put(self, key, value): """ :type key: int :type value: int :rtype: void """ if key in self.ind: index = self.ind.index(key) self.ind.pop(index) self.ind.append(key) self.val.pop(index) self.val.append(value) else: if len(self.ind) < self.n: self.ind.append(key) self.val.append(value) elif len(self.ind) == self.n: self.ind.append(key) self.ind.pop(0) self.val.append(value) self.val.pop(0) # Your LRUCache object will be instantiated and called as such: # obj = LRUCache(capacity) # param_1 = obj.get(key) # obj.put(key,value)
C++,之前用map去做一直報超時錯誤,這是參考別人的程式碼。
class LRUCache { private: int n; list<pair<int,int> > lis; unordered_map<int,list<pair<int,int>>::iterator> m; public: LRUCache(int capacity) { n = capacity; } int get(int key) { auto it = m.find(key); int ans = -1; if(it!=m.end()) { ans = it->second->second; lis.erase(it->second); lis.push_front(make_pair(key,ans)); it->second = lis.begin(); } return ans; } void put(int key, int value) { auto it = m.find(key); if(it!=m.end()) { lis.erase(it->second); lis.push_front(make_pair(key,value)); m[key] = lis.begin(); } else if(m.size()<n) { lis.push_front(make_pair(key,value)); m[key] = lis.begin(); } else { auto it = lis.end(); it--; m.erase(it->first); lis.erase(it); lis.push_front(make_pair(key,value)); it = lis.begin(); m[key] = it; } } }; /** * Your LRUCache object will be instantiated and called as such: * LRUCache obj = new LRUCache(capacity); * int param_1 = obj.get(key); * obj.put(key,value); */