class LRUCache {
private:
unordered_map<int, list<pair<int,int>>::iterator> _m;
// 新节点或刚访问的节点插入表头,因为表头指针可以通过 begin 很方便的获取到。
list<pair<int,int>> _list;
int _cap;
public:
LRUCache(int capacity) : _cap(capacity) {} // O(1)
// hash 查找,如果找到了,就把 list 中的节点接下来移到头部
int get(int key) {
auto it = _m.find(key);
if (it == _m.end()) return -;
int val = it->second->second;
_list.erase(it->second);
_list.push_front(make_pair(key, val));
_m[key] = _list.begin();
return it->second->second;
} // O(1)
// 先查找旧 key 是否存在,如果存在,将节点移动到首部。
// 如果不存在,插入新节点。
// 如果容量超限,删除最脏的节点。
void put(int key, int value) {
auto it = _m.find(key);
if (it != _m.end()) {
_list.erase(it->second);
} _list.push_front(make_pair(key, value));
_m[key] = _list.begin(); if (_list.size() > _cap) {
int key = _list.back().first;
_m.erase(key);
_list.pop_back();
}
}
}; /**
* 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);
*/

分析:

写的太丑了,不如人家写的好,只能借鉴别人的。要学的东西好多啊。

leecode第一百四十六题(LRU缓存机制)的更多相关文章

  1. leecode第一百四十二题(环形链表II)

    /** * Definition for singly-linked list. * struct ListNode { * int val; * ListNode *next; * ListNode ...

  2. leecode第一百四十八题(排序链表)

    class Solution { public: void sort_list(ListNode* head1, ListNode* head2,int len)//在原链表上进行排序 { ListN ...

  3. 【leetcode 简单】 第一百四十六题 最长和谐子序列

    和谐数组是指一个数组里元素的最大值和最小值之间的差别正好是1. 现在,给定一个整数数组,你需要在所有可能的子序列中找到最长的和谐子序列的长度. 示例 1: 输入: [1,3,2,2,5,2,3,7] ...

  4. leecode第四十六题(全排列)

    class Solution { public: vector<vector<int>> permute(vector<int>& nums) { int ...

  5. 第一百四十六节,JavaScript,百度分享保持居中--下拉菜单

    JavaScript,百度分享保持居中--下拉菜单 百度分享保持居中 效果图 html代码 <div id="share"> <h2>分享到</h2& ...

  6. 经典算法题每日演练——第十六题 Kruskal算法

    原文:经典算法题每日演练--第十六题 Kruskal算法 这篇我们看看第二种生成树的Kruskal算法,这个算法的魅力在于我们可以打一下算法和数据结构的组合拳,很有意思的. 一:思想 若存在M={0, ...

  7. CTF---Web入门第十六题 天下武功唯快不破

    天下武功唯快不破分值:10 来源: 北邮天枢战队 难度:易 参与人数:10787人 Get Flag:2264人 答题人数:3373人 解题通过率:67% 看看响应头 格式:CTF{ } 解题链接: ...

  8. 第三百四十六节,Python分布式爬虫打造搜索引擎Scrapy精讲—Requests请求和Response响应介绍

    第三百四十六节,Python分布式爬虫打造搜索引擎Scrapy精讲—Requests请求和Response响应介绍 Requests请求 Requests请求就是我们在爬虫文件写的Requests() ...

  9. 第一百四十八节,封装库--JavaScript,菜单切换

    第一百四十八节,封装库--JavaScript,菜单切换 首先在封装库封装点击切换方法 /** dian_ji_qie_huan()方法,设置点击切换,将元素设置成点击切换,也就是点击目标元素后,循环 ...

随机推荐

  1. 使用强类型DataSet增加数据并获取自动增长的ID

    使用强类型的DataSet可以方便的操作数据库:有时候我们会对表的ID设置为自动增长,并且需要在插入数据后获取新插入数据的ID,按以下方法即可达到目的: 一.     首先建立一个表,id为自动增加, ...

  2. AARRR 量化感染率

    小结: 1. 用户生命周期 2. K因子量化了感染的概率,即一个已经感染了病毒的宿主所能接触到的所有宿主中,会有多少宿主被其传染上病毒. 假设平均每个用户会向20个朋友发出邀请,而平均的转化率为10% ...

  3. 数组/Array/Tuple/yield

    数组 如果需要使用同一类型的多个对象,就可以考虑使用集合和数组.如果需要使用不同类型的多个对象,可以考虑使用Tuple(元组) 数组的声明 在声明数组时,应先定义数组元素中的类型,其后是一对空方括号和 ...

  4. 011-MAC 设置环境变量path的几种方法

    一.概述 首先要知道你使用的Mac OS X是什么样的Shell,使用命令 echo $SHELL 如果输出的是:csh或者是tcsh,那么你用的就是C Shell. 如果输出的是:bash,sh,z ...

  5. Redis入门到高可用(二十一)——缓存的使用和设计

    一.缓存的收益与成本 1.收益 2.成本 二.使用场景 三.缓存的更新策略 四.缓存颗粒度控制 五.缓存穿透 六.无底洞问题 七.热点key的重建优化  

  6. [js]变量提升-关于条件

    条件函数变量提示于全局中函数变量提升不一样. 条件中: 函数变量提升, 只是声明(现新版本浏览器中) if(g()){ function g() { return true } console.log ...

  7. 深入理解Java虚拟机3-chap4-5-斗之气10段

    一.虚拟机性能监控与故障处理 1.JDK的命令行工具:对jdk/lib/tools.jar的薄包装,Linux下可能是Shell编写,执行类似于Linux中的命令 2.可视化工具JConsole 打开 ...

  8. 说一说javascript的异步编程

    众所周知javascript是单线程的,它的设计之初是为浏览器设计的GUI编程语言,GUI编程的特性之一是保证UI线程一定不能阻塞,否则体验不佳,甚至界面卡死. 所谓的单线程就是一次只能完成一个任务, ...

  9. WxWidgets笔记

    关于环境变量的配置:解压wxwidgets的压缩包之后要新建名为 WXWIN 的环境变量,变量的值为 解压得到的目录,不知为何要使用此环境变量 编译时使用的命令:mingw32-make -j1 -f ...

  10. lua常用方法收集

    1. xlua之将c#集合转换成table -- 将c#的list转换成table local function ConvertCSListToTable(list) local t = {}; , ...