Leetcode 146. LRU缓存机制 解题思路及C++实现
生活随笔
收集整理的這篇文章主要介紹了
Leetcode 146. LRU缓存机制 解题思路及C++实现
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
解題思路:
使用一個雙向鏈表存儲最常使用的key value對,最近使用的元素放在鏈表的表頭,鏈表中最后一個元素是使用頻率最低的元素。同時,使用一個map來記錄對應的<key,<key, value>>,用于查找現在的緩存中是否有key及其value。?
?
class LRUCache { public:int n;list<pair<int, int>> lis;map<int, list<pair<int, int>>::iterator> mp;LRUCache(int capacity) {n = capacity; //初始化緩存大小}int get(int key) {int ret = -1;if(mp.find(key) != mp.end()){ // 緩存中已經存在keyauto iter = mp[key];ret = iter->second;lis.erase(iter); //在鏈表中刪除這個key和valuelis.push_front(make_pair(key, ret)); //再把這個key和value放在鏈表的表頭mp[key] = lis.begin(); //同時,要更新map中key所指向鏈表的位置}return ret; //返回value值}void put(int key, int value) {auto iter = mp.find(key); //看看map中是否有這個keyif(iter != mp.end()){ //如果有,則更新這個key在鏈表中的順序,需先刪除,然后再push_front在表頭lis.erase(iter->second);}else if(lis.size() < n){ //如果鏈表中的元素個數小于可緩存數}else{ //list中沒有key,且已超過n個int key = lis.back().first; lis.pop_back(); //擦除最少使用的key value對mp.erase(key); //同時擦除map中對應的元素}lis.push_front(make_pair(key, value));mp[key] = lis.begin();} };/*** 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);*/?
?
?
總結
以上是生活随笔為你收集整理的Leetcode 146. LRU缓存机制 解题思路及C++实现的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Leetcode 127. 单词接龙 解
- 下一篇: Leetcode 208. 实现 Tri