LeetCode OJ:LRU Cache
来源:互联网 发布:mac hosts 修改权限 编辑:程序博客网 时间:2024/05/03 15:12
LRU Cache
Total Accepted: 3543 Total Submissions: 28382My SubmissionsDesign 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.
算法思想:
LRU算法自不必多说,我这里是想自己写写实现下hashmap和双端循环队列,所以代码比较烦,如果用STL模板库就方便多了
思想就是:利用双端循环队列处理新元素的增加及快速删除,因为头结点的next指针指向的就是最早进入队列的元素,即要删除的元素,head结点的pre指针指向的是最新加入的元素;
利用hashmap能迅速找到队列中的节点,然后将该节点加入到队尾
#define MAX 10000#define MOD 9991struct node{int key;int val;node *pre;node *next;node(int k,int v):key(k),val(v),pre(this),next(this){}};class DQueue{node *head;int Size;node *Hash[MAX][20];int len[MAX];int _hash(int key){return key%MOD;}node * search(int key){int pos=_hash(key);for(int i=0;i<len[pos];i++){if(key==Hash[pos][i]->key){node *t=Hash[pos][i];t->pre->next=t->next;t->next->pre=t->pre;t->pre=head->pre;head->pre->next=t;t->next=head;head->pre=t;return t;}}return NULL;}public:DQueue(){head=new node(0,0);memset(len,0,sizeof(len));Size=0;}int insert(int key,int val){node *i=search(key);if(i!=NULL){i->val=val;return 1;}node *t=new node(key,val);t->next=head;t->pre=head->pre;head->pre->next=t;head->pre=t;int pos=_hash(key);Hash[pos][len[pos]++]=t;Size++;return 1;}int delHead(){node *p=head->next;head->next=p->next;p->next->pre=head;delete[] p;Size--;return 1;}int find(int key){node *f=search(key);if(f!=NULL)return f->val;return -1;}int size(){return Size;}};class LRUCache{DQueue *dq;int capa;public:LRUCache(int capacity){capa=capacity;dq=new DQueue();}int get(int key){return dq->find(key);}void set(int key,int value){dq->insert(key,value);if(dq->size()>capa){dq->delHead();}}};
answer2
//时间复杂度O(logn),空间复杂度O(n)class LRUCache{ struct CacheNode{ int key; int val; CacheNode(int k,int v):key(k),val(v){} };public: LRUCache(int capacity) { this->capacity=capacity; } int get(int key) { if(cacheMap.find(key) == cacheMap.end())return -1; //把当前访问结点移到表头,并更新map cacheList.splice(cacheList.begin(),cacheList,cacheMap[key]); cacheMap[key] = cacheList.begin(); return cacheMap[key]->val; } void set(int key, int value) { if(cacheMap.find(key) == cacheMap.end()){ if(cacheList.size() == capacity){ cacheMap.erase(cacheList.back().key); cacheList.pop_back(); } cacheList.push_front(CacheNode(key,value)); cacheMap[key]=cacheList.begin(); } else{ cacheMap[key]->val=value; cacheList.splice(cacheList.begin(),cacheList,cacheMap[key]); cacheMap[key] = cacheList.begin(); } }private: list<CacheNode> cacheList; unordered_map<int,list<CacheNode>::iterator> cacheMap; int capacity;};
0 0
- LeetCode OJ:LRU Cache
- LeetCode OJ - LRU Cache
- LeetCode OJ LRU Cache
- [LeetCode OJ] LRU Cache 解题报告
- LeetCode OJ 之 LRU Cache(LRU缓存)
- LeetCode LRU 缓存 LRU Cache
- 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
- Leetcode: LRU Cache
- Erlang基础 - 模块的编译和函数的调用
- LeetCode OJ:Insertion Sort List
- 回调函数
- 软工文档总结
- Unity鼠标中键滚动缩放相机,左键点击场景中模型居中显示
- LeetCode OJ:LRU Cache
- 算法入门之蚂蚁
- Integer to Roman 整数转换成罗马数字
- centos5.5下android开发环境搭建
- 链表:C版单链表代码
- 单例模式--GOF的23个之一
- 数据结构 课程推荐(砖头)
- 管理/var/log/messages
- unity3d中脚本生命周期(MonoBehaviour lifecycle)