[LeetCode]LRU Cache有个问题,求大神解答【已解决】
来源:互联网 发布:手机备份软件排名 编辑:程序博客网 时间:2024/05/16 19:55
题目:
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; //用于保存使用情况,队头是最久未使用的,队尾是最近使用的 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()) //如果没有找到key17 return -1;18 else //如果找到了key,就在对应的最近latest队列里面修改key的位置,先把key所在的位置删除,再把key放到队尾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()) //如果要插入的已经有key存在,就先在优先队列里面找到key出现的位置,删除,再把key插入队尾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中插入,再在队尾添加该key44 {45 num++;46 cache.insert(std::pair< int, int >(key, value));47 latest_key.push_back(key);48 }49 else //如果cache已经满了,则根据队头元素,在cache删除对应键值,再在队列中删除这个队头,之后,把新要插入的键值插入cache中,把新key插入队尾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 };
当我把代码中出现:
1 iter = latest_key.begin();2 while (*iter != key)3 iter++;
部分替换为:
1 iter=find(latest_key.begin(),latest_key.end(),key);
就会报错:
Time Limit Exceeded
Last executed input: 2048,[set(1178,3401),set(903,6060).....
我大致查了一下find的实现机制,也是遍历啊,按理说这两者效率差不多,为什么替换之后就不能通过?而替换之前能通过,求大神解答!!
万分感谢!!!
在Leetcode上问,已经得到答案:
之前的那个算法效率确实不高,压线过的,修改了原有代码,增加了一个unordered_map<int, list<int>iterator>用来索引list,可以使时间复杂度降到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 };
- [LeetCode]LRU Cache有个问题,求大神解答【已解决】
- 条件运算符与逗号的嵌套的疑问,求大神解答(已自行解决)
- LeetCode 之 LRU Cache解决思路
- SQL SERVER2008超时问题,求大神解答
- LeetCode LRU 缓存 LRU Cache
- android定位已获取经纬度,上传google解析后textview不显示,基础问题,求大神解答~~>_<`
- 跪求大神解答
- LRU Cache | leetcode
- Leetcode: LRU Cache
- LeetCode:LRU Cache
- Leetcode: LRU Cache
- [LeetCode] LRU Cache
- leetcode之LRU Cache
- [LeetCode]LRU Cache
- [LeetCode] LRU Cache
- leetcode LRU Cache
- LeetCode题解:LRU Cache
- LeetCode | LRU Cache
- Android Service 解析
- error127:The specified procedure could not be found.无法找到入口 无法定位程序输入点xxx 于动态链接库ulib.dll上
- 将博客搬至CSDN
- 分享一篇不错的博文《写给准备参加秋招的学弟学妹们~一定要来看哦~》
- Linux上的free命令详解
- [LeetCode]LRU Cache有个问题,求大神解答【已解决】
- EBJ内部参考
- 浅谈reverse_iterator的base()函数
- 掌握-----字节流与字符流
- 改错题_101
- MySQL存储过程详解 mysql 存储过程
- MySQL 常用查询命令
- UVA - 11324 The Largest Clique 强连通缩点+记忆化dp
- Linux 守护进程的编程方法