一、题目描述

运用你所掌握的数据结构,设计和实现一个  LRU (最近最少使用) 缓存机制 。

实现 LRUCache 类:

LRUCache(int capacity) 以正整数作为容量 capacity 初始化 LRU 缓存

int get(int key) 如果关键字 key 存在于缓存中,则返回关键字的值,否则返回 -1 。

void put(int key, int value) 如果关键字已经存在,则变更其数据值;如果关键字不存在,则插入该组「关键字-值」。当缓存容量达到上限时,它应该在写入新数据之前删除最久未使用的数据值,从而为新的数据值留出空间。

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

提示:

1 <= capacity <= 3000

0 <= key <= 10000

0 <= value <= 105

最多调用 2 * 10^5 次 get 和 put

二、解题思路

实现本题的两种操作,需要用到一个哈希表和一个双向链表。在 Python 语言中,有一种结合了哈希表与双向链表的数据结构 OrderedDict,只需要短短的几行代码就可以完成本题。

在 Java 语言中,同样有类似的数据结构

LinkedHashMap。

三、代码

1、Python

class LRUCache(collections.OrderedDict):     def __init__(self, capacity: int):        super().__init__()        self.capacity = capacity      def get(self, key: int) -> int:        if key not in self:            return -1        self.move_to_end(key)        return self[key]     def put(self, key: int, value: int) -> None:        if key in self:            self.move_to_end(key)        self[key] = value        if len(self) > self.capacity:            self.popitem(last=False)

2、Java

class LRUCache extends LinkedHashMap<Integer, Integer>{    private int capacity;        public LRUCache(int capacity) {        super(capacity, 0.75F, true);        this.capacity = capacity;    }     public int get(int key) {        return super.getOrDefault(key, -1);    }     public void put(int key, int value) {        super.put(key, value);    }     @Override    protected boolean removeEldestEntry(Map.Entry<Integer, Integer> eldest) {        return size() > capacity;     }}

三、复杂度分析

时间复杂度:对于 put 和 get 都是 O(1)。

空间复杂度:O(capacity),因为哈希表和双向链表最多存储 capacity+1 个元素。

LRU LeetCode相关推荐

  1. java lru lfu_内存淘汰机制——LRU与LFU

    内存淘汰机制之LRU与LFU LRU(Least Recently Used):淘汰 近期最不会访问的数据 LFU(Least Frequently Used):淘汰 最不经常使用(访问次数少) 所谓 ...

  2. taoqick 搜索自己CSDN博客

    L1 L2正则化和优化器的weight_decay参数 kaiming初始化的推导 Pytorch动态计算图 Pytorch自动微分机制 PyTorch中在反向传播前为什么要手动将梯度清零? 通俗讲解 ...

  3. LeetCode实战:LRU缓存机制

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

  4. LeetCode:146_LRU cache | LRU缓存设计 | Hard

    题目:LRU cache Design and implement a data structure for Least Recently Used (LRU) cache. It should su ...

  5. LeetCode LRU Cache(最近最少使用缓存)

    问题:设计一个最近最少使用缓存.支持get和put操作 1.如果get(key)中,key在缓存中不存在,返回-1 2.put(key,value),如果key在缓存中不存在,则插入.当缓存到达容量时 ...

  6. 【LeetCode】LRU Cache 解决报告

    插话:只写了几个连续的博客,博客排名不再是实际"远在千里之外"该.我们已经进入2一万内. 再接再厉.油! Design and implement a data structure ...

  7. [LeetCode]LRU Cache有个问题,求大神解答【已解决】

    题目: Design and implement a data structure for Least Recently Used (LRU) cache. It should support the ...

  8. LeetCode 146. LRU缓存机制(哈希链表)

    文章目录 1. 题目信息 2. 解题 2.1 手动实现list 2.2 使用内置list 1. 题目信息 运用你所掌握的数据结构,设计和实现一个 LRU (最近最少使用) 缓存机制.它应该支持以下操作 ...

  9. LeetCode —— 146. LRU缓存机制(Python)

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

最新文章

  1. 深入理解PHP原理之变量(Variables inside PHP)
  2. 开源项目中成长:从实习小白到核心开发者
  3. Java学习个人备忘录之线程间的通信
  4. 计网 - 网络 I/O 模型:BIO、NIO 和 AIO 有什么区别?
  5. 感谢您的提问_感谢您的反馈,我们正在改进的5种方法
  6. 全球首例无人车撞人致死事故判决:Uber无罪,安全员要进一步调查
  7. 遍历字典时用与不用iter的区别
  8. Eclipse主题下载安装
  9. C/C++基础学习代码(1)
  10. 贪心法--->1.会议安排问题
  11. 基于stm32的智能输液系统设计
  12. iphone,ipad 尺寸,iphone常用控件尺寸
  13. matlab postscript,Postscript软件特点全面解析
  14. “另类”计算IP地址和子网划分
  15. 写了placement new也要写placement delete——条款52
  16. 程序员自我修养笔记:第九章
  17. sap pi的操作1
  18. 电容的材质资料/什么cog,x5r y5v等知识
  19. Life with qmail -- 中文版(英文版本16 Aug 2003)
  20. Angular--A required parameter cannot follow an optional parameter.(必选参数不能位于可选参数后)

热门文章

  1. [Leetcode总结] 104.二叉树的最大深度
  2. 详细图文演示——排除启动类故障以及Linux操作系统引导、运行级别和优化启动等相关知识
  3. html5 制作神器,HTML5/Canvas 简单的泡沫生成器
  4. python for arcgis_面向ArcGIS的Python脚本编程 ([美]赞德伯根) 中文pdf扫描版[50MB]
  5. 一文搞定Linux shell脚本编程( 史上最全汇总 )
  6. myeclipse写简单bbs代码_RabbitMQ实现即时通讯居然如此简单!连后端代码都省得写了?...
  7. android布局DSL,android – 使用自定义Anko布局DSL解除警报对话框
  8. Dws同步mysql数据_数据库技术丨GaussDB(DWS)数据同步状态查看方法
  9. python树形_Python处理树形数组
  10. html动画曲线快速结束,css3动画如何在动作结束时保持该状态不变