欢迎来到尧图网

客户服务 关于我们

您的位置:首页 > 汽车 > 时评 > 【力扣hot100题】(034)LRU缓存

【力扣hot100题】(034)LRU缓存

2025/4/8 23:30:18 来源:https://blog.csdn.net/s478527548/article/details/146937981  浏览:    关键词:【力扣hot100题】(034)LRU缓存

做完这题已经没有任何力气写链表题了。

思路很简单,就是调试特别的痛苦。

老是频频报错,唉。

class LRUCache {
public:struct ListNode{int key,val;ListNode* next; ListNode* prev;ListNode() : key(0), val(0), next(nullptr), prev(nullptr) {}ListNode(int key, int value) : key(key), val(value), next(nullptr), prev(nullptr) {}ListNode(int key, int value, ListNode* next=nullptr, ListNode* prev=nullptr) : key(key), val(value), next(next), prev(prev) {}};ListNode* head=new ListNode();ListNode* tail=head;int capacity;map<int,ListNode*> hash;LRUCache(int capacity) {this->capacity=capacity;}int get(int key) {if(hash.find(key)!=hash.end()){if(head->next==hash[key]) return hash[key]->val;hash[key]->prev->next=hash[key]->next;if(hash[key]->next) hash[key]->next->prev=hash[key]->prev;if(hash[key]==tail) tail=hash[key]->prev;hash[key]->next=head->next;if(head->next) head->next->prev=hash[key];hash[key]->prev=head;head->next=hash[key];return hash[key]->val;}else return -1;}void put(int key, int value) {if(hash.find(key)!=hash.end()){hash[key]->val=value;get(key);return;}else if(capacity==0){hash.erase(tail->key);tail=tail->prev;tail->next=nullptr;}else capacity--;ListNode* newhead=new ListNode(key,value,head->next,head);if(tail==head) tail=newhead;if(head->next) head->next->prev=newhead;head->next=newhead;hash[key]=newhead;}
};/*** 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);*/

看了答案,其实有更好的做法,可以优化并且降低代码的复杂度,感觉我写代码还是太畏缩了。

优化方案一:将头指针和尾指针都设成虚拟指针,一个指向双向链表头部的前一个位置,一个指向尾部的后一个位置。(我写的时候为了节省空间复杂度只弄了一个头虚拟指针,还是太不敢了)

优化方案二:构造更多的函数,这样就可以直接调用,代码逻辑会清晰很多。

于是按这个改进思路又写了一遍,果然简单多了……

class LRUCache {
public:struct ListNode{int key,val;ListNode* next; ListNode* prev;ListNode() : key(0), val(0), next(nullptr), prev(nullptr) {}ListNode(int key, int value, ListNode* next=nullptr, ListNode* prev=nullptr) : key(key), val(value), next(next), prev(prev) {}};ListNode* head;ListNode* tail;int capacity;unordered_map<int,ListNode*> hash;LRUCache(int capacity) {this->capacity=capacity;head=new ListNode();tail=new ListNode(0,0,nullptr,head);head->next=tail;}int get(int key) {if(hash.find(key)==hash.end()) return -1;erase(hash[key]);insert(hash[key]);return hash[key]->val;}void put(int key, int value) {if(hash.find(key)!=hash.end()){hash[key]->val=value;erase(hash[key]);insert(hash[key]);return ;}if(capacity>0) capacity--;else if(capacity==0){hash.erase(tail->prev->key);erase(tail->prev);}ListNode* newnode=new ListNode(key,value,nullptr,nullptr);insert(newnode);hash[key]=newnode;}void erase(ListNode* node){node->prev->next=node->next;node->next->prev=node->prev;}void insert(ListNode* node){head->next->prev=node;node->next=head->next;node->prev=head;head->next=node;}
};/*** 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);*/

版权声明:

本网仅为发布的内容提供存储空间,不对发表、转载的内容提供任何形式的保证。凡本网注明“来源:XXX网络”的作品,均转载自其它媒体,著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处。

我们尊重并感谢每一位作者,均已注明文章来源和作者。如因作品内容、版权或其它问题,请及时与我们联系,联系邮箱:809451989@qq.com,投稿邮箱:809451989@qq.com

热搜词