运用你所掌握的数据结构,设计和实现一个  LRU (最近最少使用) 缓存机制。它应该支持以下操作: 获取数据 get 和 写入数据 put 。

获取数据 get(key) - 如果密钥 (key) 存在于缓存中,则获取密钥的值(总是正数),否则返回 -1。
写入数据 put(key, value) - 如果密钥已经存在,则变更其数据值;如果密钥不存在,则插入该组「密钥/数据值」。当缓存容量达到上限时,它应该在写入新数据之前删除最久未使用的数据值,从而为新的数据值留出空间。

进阶:

你是否可以在 O(1) 时间复杂度内完成这两种操作?

示例:

LRUCache cache = new LRUCache( 2 /* 缓存容量 */ );

cache.put(1, 1);
cache.put(2, 2);
cache.get(1);       // 返回  1
cache.put(3, 3);    // 该操作会使得密钥 2 作废
cache.get(2);       // 返回 -1 (未找到)
cache.put(4, 4);    // 该操作会使得密钥 1 作废
cache.get(1);       // 返回 -1 (未找到)
cache.get(3);       // 返回  3
cache.get(4);       // 返回  4

思路:用一个链表记录当前缓存中所有的键值对,并且每次新来的访问都对链表进行重新调整,把最近访问的键值对放到链表头部。然后为了快速访问缓存中的值,维护一个map,key是实际数据的key,对应的value指向该key在链表中的位置节点,这样每次添加键值对时,先判断map中是否有该key,若有则修改链表中对应节点的value;若没有则把该键值对添加到链表头部,去除链表尾部超过规定长度的节点,并在map中添加key以及对应的链表节点指针。

class LRUCache {
public:LRUCache(int capacity) {size = capacity;}int get(int key) {auto it = hash.find(key);if(it == hash.end()) return -1;cache.splice(cache.begin(), cache, it->second);return it->second->second;}void put(int key, int value) {auto it = hash.find(key);if(it != hash.end()){it->second->second = value;cache.splice(cache.begin(), cache, it->second);}else{cache.insert(cache.begin(), make_pair(key, value));hash[key] = cache.begin();if(cache.size() > size){hash.erase(cache.back().first);cache.pop_back();}}}
private:unordered_map<int, list<pair<int, int>>::iterator> hash;list<pair<int, int>> cache;int size;
};/*** 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);*/

LRU缓存机制—leetcode146相关推荐

  1. 实现 LRU 缓存机制

    实现 LRU 缓存机制 文章目录 实现 LRU 缓存机制 一.什么是 LRU 算法 二.LRU 算法描述 三.LRU 算法设计 四.代码实现 一.什么是 LRU 算法 LRU 就是一种缓存淘汰策略.( ...

  2. 146. LRU 缓存机制

    146. LRU 缓存机制 运用你所掌握的数据结构,设计和实现一个 LRU (最近最少使用) 缓存机制 . 实现 LRUCache 类: LRUCache(int capacity) 以正整数作为容量 ...

  3. LRU缓存机制,你想知道的这里都有

    概述 LRU是Least Recently Used的缩写,译为最近最少使用.它的理论基础为 "最近使用的数据会在未来一段时期内仍然被使用,已经很久没有使用的数据大概率在未来很长一段时间仍然 ...

  4. LRU 缓存机制实现:哈希表 + 双向链表

    算法详解 LRU 缓存机制可以通过哈希表辅以双向链表实现,我们用一个哈希表和一个双向链表维护所有在缓存中的键值对. 双向链表按照被使用的顺序存储了这些键值对,靠近头部的键值对是最近使用的,而靠近尾部的 ...

  5. Java实现 LeetCode 146 LRU缓存机制

    146. LRU缓存机制 运用你所掌握的数据结构,设计和实现一个 LRU (最近最少使用) 缓存机制.它应该支持以下操作: 获取数据 get 和 写入数据 put . 获取数据 get(key) - ...

  6. Leetcode 146. LRU缓存机制【哈希表 [哈希表存储每个元素在双向链表中的指针]+双向链表】

    文章目录 问题描述 解题报告 实验代码 参考资料 问题描述 运用你所掌握的数据结构,设计和实现一个 LRU (最近最少使用) 缓存机制.它应该支持以下操作: 获取数据 get 和 写入数据 put . ...

  7. LeetCode实战:LRU缓存机制

    背景 为什么你要加入一个技术团队? 如何加入 LSGO 软件技术团队? 我是如何组织"算法刻意练习活动"的? 为什么要求团队的学生们写技术Blog 题目英文 Design and ...

  8. LeetCode第 146 号问题: LRU 缓存机制

    题目描述 运用你所掌握的数据结构,设计和实现一个 LRU (最近最少使用) 缓存机制.它应该支持以下操作: 获取数据 get 和 写入数据 put . 获取数据 get(key) - 如果密钥 (ke ...

  9. 面试高频题: LRU缓存机制实现

    题目 运用你所掌握的数据结构,设计和实现一个  LRU (最近最少使用) 缓存机制.它应该支持以下操作: 获取数据 get 和 写入数据 put . 获取数据 get(key) - 如果密钥 (key ...

最新文章

  1. Linux程序包管理之RPM
  2. 学习笔记Spark(二)—— Spark集群的安装配置
  3. 2018年4月java自考真题,全国2018年4月自考互联网数据库考试真题
  4. mysql子分区多少层_MYSQL子分区修剪
  5. 变量和简单数据类型(一)
  6. 结对开发——返回一个整数数组中最大子数组的和 (首尾相接版)
  7. [Jmeter] 基本使用的总结
  8. github pages_在GitHub Pages上发布组织主页
  9. 使用vmstat和iostat命令进行Linux性能监控
  10. 【华为云技术分享】为什么说物联网平台是城市数字化的必备底座
  11. MySQL 宣布停止使用 master、slave!
  12. SSE/AVX/AVX2汇编技巧
  13. 超详细的Latex快速基础入门 (第二节)【关于latex命令的一些知识】
  14. 想要体验《失控玩家》里Guy的视角,299美元还远远不够
  15. [敏捷开发培训] Scrum 和 Kanban
  16. 再探传说──啤酒与尿布的故事
  17. 阿里云同步gcr.io的镜像
  18. 直播软件搭建直播服务架构
  19. 产品经理 - 路漫漫其修远兮
  20. 《武道神尊》12.29上线链游玩家|放置挂机、轻松修真

热门文章

  1. java boxplot_Matlab Boxplots
  2. Java编程基础篇第四章
  3. MYSQL中group_concat有长度限制!默认1024
  4. Ubuntu 14.04.5 imx6 开发环境搭建
  5. 2、eclipse中使用Maven
  6. 第三次spring冲刺1
  7. 成功者五大因素 奸的好人-笔记
  8. [转载] NoSQL开篇——为什么要使用NoSQL
  9. IE 域组策略对服务器无效的原因
  10. ie6 select出现在浮动层上面的解决方法