博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Leetcode--LRU Cache
阅读量:5360 次
发布时间:2019-06-15

本文共 3068 字,大约阅读时间需要 10 分钟。

 

参考了 ,是用双向链表和unordered_map来实现的,难点在于复杂的指针操作,以及每次get,set之后都要考虑map是否要改变,还有,要同步更新size,这也容易遗忘
最后,我从中抽象出一个moveToHead的函数,简化了代码
 
本来想用单链表实现的,到中途发现似乎不行
事后的思考:也许有单独的不存储数据的头结点和尾节点会使得真正操作简单一点,可以避免考虑很多边界情况,NULL指针问题
 
//seems that single linked list is not enough#include 
#include
#include
using namespace std;class Node{public: int key; int value; Node *next; Node *prev; Node(int k, int v, Node* n, Node *pre):key(k),value(v),next(n), prev(pre){}};class LRUCache{public: LRUCache(int capacity) { if(capacity < 0){ printf("error"); exit(-1); } _head = _tail = NULL; _size = 0; _cap = capacity; } ~LRUCache(){ if(_head == NULL) return; Node *p = _head, *q = _head->next; while(q){ delete p; p = q; q = q->next; } delete p; } int get(int key) { auto it = _map.find(key); if(it == _map.end()){ return -1; } else { moveToHead(it->second); return it->second->value; } } void set(int key, int value) { if(_cap == 0) return; if(_cap == 1){ if(_size == 1){ _map.erase(_head->key); _map[key] = _head; _head->key = key; _head->value = value; return; } else {
//_size==0 _head = _tail = new Node(key,value,NULL,NULL); _map[key] = _head; _size++; return; } } //_cap >= 2 auto it = _map.find(key); if(it == _map.end()){ if(_size < _cap){ Node *p = new Node(key,value,_head, NULL); if(_head == NULL){ _head = _tail = p; _map[key] = _head; _size++; return; } _head->prev = p; _head = p; _map[key] = p; _size++; } else {
//_size >= _cap >= 0, actually, we always ensure that _cap >= _size, so _size must equal to _cap //_size == _cap >= 2 Node *p = _tail; _map.erase(_tail->key); p->key = key; p->value = value; _map[key] = p; moveToHead(p); } } else { it->second->value = value; moveToHead(it->second); } } void moveToHead(Node* p){ if(p==_head) return; p->prev->next = p->next; if(p == _tail){ _tail = p->prev; } else { p->next->prev = p->prev; } p->next = _head; p->prev = NULL; _head->prev = p; _head = p; }private: unordered_map
_map; Node *_head, *_tail; int _size; int _cap;};

编译要指定C++11(当然,你还要提供一个main函数才行),对于g++来说,添加 -std=c++11

 

 

转载于:https://www.cnblogs.com/fstang/p/3598614.html

你可能感兴趣的文章
web@h,c小总结
查看>>
java编程思想笔记(一)——面向对象导论
查看>>
Data Structure 基本概念
查看>>
Ubuntu改坏sudoers后无法使用sudo的解决办法
查看>>
NEYC 2017 游记
查看>>
[搬运] 写给 C# 开发人员的函数式编程
查看>>
Python之旅Day14 JQuery部分
查看>>
core--线程池
查看>>
redux-effect
查看>>
他山之石:加载图片的一个小问题
查看>>
shell - 常识
查看>>
linux下编译复数类型引发的错误:expected unqualified-id before '(' token
查看>>
codeforces 1041A Heist
查看>>
Spring Cloud Stream消费失败后的处理策略(三):使用DLQ队列(RabbitMQ)
查看>>
PKUWC2018 5/6
查看>>
As-If-Serial 理解
查看>>
洛谷P1005 矩阵取数游戏
查看>>
在Silverlight中使用HierarchicalDataTemplate为TreeView实现递归树状结构
查看>>
无线通信基础(一):无线网络演进
查看>>
关于python中带下划线的变量和函数 的意义
查看>>