[LeetCode]LRU Cache有个问题,求大神解答【已解决】
題目:
Design and implement a data structure for Least Recently Used (LRU) cache. It should support the following operations:?get?and?set.
get(key)?- Get the value (will always be positive) of the key if the key exists in the cache, otherwise return -1.
set(key, value)?- Set or insert the value if the key is not already present. When the cache reached its capacity, it should invalidate the least recently used item before inserting a new item.
這是我的代碼:
1 class LRUCache{ 2 public: 3 int num; 4 int max; 5 list<int> latest_key; //用于保存使用情況,隊(duì)頭是最久未使用的,隊(duì)尾是最近使用的 6 unordered_map<int, int> cache; //用于保存key,value 7 8 LRUCache(int capacity) { 9 num = 0; 10 max = capacity; 11 } 12 13 int get(int key) { 14 unordered_map<int, int>::iterator it = cache.find(key); 15 list<int>::iterator iter; 16 if (it == cache.end()) //如果沒有找到key 17 return -1; 18 else //如果找到了key,就在對(duì)應(yīng)的最近latest隊(duì)列里面修改key的位置,先把key所在的位置刪除,再把key放到隊(duì)尾 19 { 20 iter = latest_key.begin(); 21 while (*iter != key) 22 iter++; 23 latest_key.erase(iter); 24 latest_key.push_back(key); 25 return it->second; 26 } 27 } 28 29 void set(int key, int value) { 30 unordered_map<int, int>::iterator it = cache.find(key); 31 list<int>::iterator iter; 32 if (it != cache.end()) //如果要插入的已經(jīng)有key存在,就先在優(yōu)先隊(duì)列里面找到key出現(xiàn)的位置,刪除,再把key插入隊(duì)尾 33 { 34 it->second = value; 35 iter = latest_key.begin(); 36 while (*iter != key) 37 iter++; 38 latest_key.erase(iter); 39 latest_key.push_back(key); 40 } 41 else //如果要插入的不存在 42 { 43 if (num<max) //如果不超過cache容量,則直接在cahe中插入,再在隊(duì)尾添加該key 44 { 45 num++; 46 cache.insert(std::pair< int, int >(key, value)); 47 latest_key.push_back(key); 48 } 49 else //如果cache已經(jīng)滿了,則根據(jù)隊(duì)頭元素,在cache刪除對(duì)應(yīng)鍵值,再在隊(duì)列中刪除這個(gè)隊(duì)頭,之后,把新要插入的鍵值插入cache中,把新key插入隊(duì)尾 50 { 51 int latest = latest_key.front(); 52 cache.erase(latest); 53 latest_key.pop_front(); 54 cache.insert(std::pair< int, int >(key, value)); 55 latest_key.push_back(key); 56 } 57 } 58 } 59 };當(dāng)我把代碼中出現(xiàn):
1 iter = latest_key.begin(); 2 while (*iter != key) 3 iter++;部分替換為:
1 iter=find(latest_key.begin(),latest_key.end(),key);就會(huì)報(bào)錯(cuò):
Time Limit Exceeded
Last executed input: 2048,[set(1178,3401),set(903,6060).....
我大致查了一下find的實(shí)現(xiàn)機(jī)制,也是遍歷啊,按理說這兩者效率差不多,為什么替換之后就不能通過?而替換之前能通過,求大神解答!!
萬分感謝!!!
在Leetcode上問,已經(jīng)得到答案:
?
之前的那個(gè)算法效率確實(shí)不高,壓線過的,修改了原有代碼,增加了一個(gè)unordered_map<int, list<int>iterator>用來索引list,可以使時(shí)間復(fù)雜度降到O(1):
1 class LRUCache{ 2 private: 3 unordered_map<int, int> cache; 4 unordered_map<int, list<int>::iterator> find_key; 5 list<int> latest_key; 6 int max; 7 public: 8 LRUCache(int capacity) : max(capacity){ 9 10 } 11 12 int get(int key) { 13 if (cache.find(key) == cache.end()){ 14 return -1; 15 } 16 latest_key.erase(find_key[key]); 17 latest_key.push_front(key); 18 find_key[key] = latest_key.begin(); 19 return cache[key]; 20 } 21 22 void set(int key, int value) { 23 if (cache.find(key) == cache.end()) { 24 if (cache.size() >= max) { 25 cache.erase(latest_key.back()); 26 latest_key.pop_back(); 27 cache[key] = value; 28 latest_key.push_front(key); 29 find_key[key] = latest_key.begin(); 30 } 31 else { 32 cache[key] = value; 33 latest_key.push_front(key); 34 find_key[key] = latest_key.begin(); 35 } 36 } 37 else { 38 cache[key] = value; 39 latest_key.erase(find_key[key]); 40 latest_key.push_front(key); 41 find_key[key] = latest_key.begin(); 42 } 43 } 44 };?
轉(zhuǎn)載于:https://www.cnblogs.com/yanqi0124/p/3806680.html
總結(jié)
以上是生活随笔為你收集整理的[LeetCode]LRU Cache有个问题,求大神解答【已解决】的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 字符串相似度算法——Levenshtei
- 下一篇: configparser操作配置文件