LeetCode-146:LRU Cache (最近使用缓存)

LeetCode第146题解析 运用你所掌握的数据结构,设计和实现一个LRU (最近最少使用) 缓存机制。它应该支持以下操作: 获取数据 get 和 写入数据 put 。 获取数据 get(key) - 如果关键字 (key) 存在于缓存中,则获取关键字的值(总是正数),否则返回 -1。 写入数据 put(key, value) - 如果关键字已经存在,则变更其数据值;如果关键字不存在,则插入该组「关键字/值」。当缓存容量达到上限时,它应该在写入新数据之前删除最久未使用的数据值,从而为新的数据值留出空间。 进阶: 你是否可... 阅读详情

题目:

Design and implement a data structure for Least Recently Used (LRU) cache. It should support the following operations: get and put.

  • get(key) - Get the value (will always be positive) of the key if the key exists in the cache, otherwise return -1.
  • put(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.

Follow up:
Could you do both operations in O(1) time complexity?

例子:

Example:

LRUCache cache = new LRUCache( 2 /* capacity */ );

cache.put(1, 1);
cache.put(2, 2);
cache.get(1);       // returns 1
cache.put(3, 3);    // evicts key 2
cache.get(2);       // returns -1 (not found)
cache.put(4, 4);    // evicts key 1
cache.get(1);       // returns -1 (not found)
cache.get(3);       // returns 3
cache.get(4);       // returns 4

问题解析:

设计一个最近使用缓存的结构,使得该缓存具有get和put操作,并且,缓存有容量(capacity)上限。

链接:

思路标签

链表、hash map

解答:

  • 为快速添加和删除,我们需要使用链表来设计cache,链表中从头到尾的数据顺序依次是:(最近访问)->…(最旧访问);
  • 因为是最近访问的在链表的最前,我们使用list来保存key值,而使用hashmap来保存(key,value)对即可,同时需要对value进行改造,因为我们还需要将每一个value与list中的key结点进行绑定,组成pair,以便每次操作进行list的最近访问的调整;
  • 添加节点put(key, value):
    • 判断hashmap中是否存在key节点,如果存在则调整List,将key置为头部(最近访问),更新hashmap指向key节点的指针;
    • 如果不存在key值对,则判断capacity是否满容,若不满容量则直接在list和hashmap中加入新节点(list在表头添加);否则则删除list末尾key和hashmap中的对应值对,再进行添加。
    • 新节点插入到表头即可,时间复杂度O(1)。
  • 查找节点get(key):
    • 在hashmap中查询,若不存在则返回-1;
    • 若存在,则调整list位置更新hashmap对应指针,返回key对应的value;
    • 每次节点被查询到时,将节点移动到链表头部,时间复杂度O(1)。
class LRUCache {
public:
    LRUCache(int capacity) : _capacity(capacity) {}

    int get(int key) {
        auto it = cache.find(key);
        if(it == cache.end())
            return -1;
        adjust(it);
        return it->second.first;
    }

    void put(int key, int value) {
        auto it = cache.find(key);
        if(it != cache.end())
            adjust(it);
        else{
            if(cache.size() == _capacity){
                cache.erase(used.back());
                used.pop_back();
            }
            used.push_front(key);
        }
        cache[key] = {value, used.begin()};
    }

private:
    typedef pair<int, list<int>::iterator> valListPair;
    typedef unordered_map<int, valListPair> keyValMap;
    list<int> used;
    keyValMap cache;
    int _capacity;

    void adjust(keyValMap::iterator it){
        int key = it->first;
        used.erase(it->second.second);
        used.push_front(key);
        it->second.second = used.begin();
    }
};

/**
 * 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);
 */
【leetcode】(python)146. LRU Cache最近最少使用缓存 最近最少使用缓存DescriptionExample题意解体思路code 146. LRU Cache Medium Description Design and implement a data structure for Least Recently Used (LRU) cache. It should support the following operations: get and pu... 阅读详情

相关推荐

图解LeetCode146:LRU cache

文章目录思考过程代码实现总结 这是LeetCode中第146号题目,不多说,这也是一个准备面试的同学必备的一道题目,出镜率非常高。 那么什么是LRU cache呢,假设有一个大小为6的数组,最开始保存的是[1,2,3,4,5,6],如果这个数组就是LRU cache的话会有这样的性质: 一图胜千言,现在你应该明白什么是LRU cache了吧。 LRU的全称是Least Recently Used...

码农的荒岛求生 566

LeetCode第 146 题:LRU缓存机制(C++)

146. LRU缓存机制 - 力扣(LeetCode) LRU需要注意: 1、访问了某个元素之后,就要把这个元素的位置放到缓存的头部(最近使用) 2、向缓存写入数据是,先检查该数据是否存在,如果不存在,则在头部写入,否则就将存在的值移动到头部(因为也算是进行了访问),题目还要求了对存在的值进行修改 3、缓存满了之后,从缓存的尾部(最久没使用)开始删除元素以腾出空间 第一条,需要移除该元素,并将该元素放到头部,也就是快速的删除和添加,删除的元素可能在任何位置。那就最好使用链表了,链表删除/添加元素的复杂度

zj 1336

股票交易接口TDX量化下单接口

对于需要同时操作多只股票的投资者而言,这一功能可以一次性处理多个交易指令,大大提高了交易的效率。通过回测,投资者可以发现策略中的不足之处,进而进行优化和调整,提高策略的可靠性。根据通达信提供的安装指南,下载相应的安装程序并进行安装。这包括设置交易账户的相关信息,如账户名、密码等,以及连接到正确的交易服务器。不同的情况可能会有不同的标准,有的可能要求账户使用达到一定的时长,有的可能对账户内的资产金额有最低要求。可以通过接口提供的监控功能或者第三方工具,实时查看交易状态、交易数据等信息,确保交易按照预期进行。

2401_88470113的博客 1289

Java实现LRU缓存模型

设计一个简单版的最近使用缓存模型。缓存空间有容量限制,时间复杂度要求是理论O(1),key和value的类型可以是任意类型。其中“最近使用”是指最近被访问过对cache的操作有:添加(put (key, value))、查找(get(key))、替换(put (key, value)),因有容量限制,还需有私有的删除方法,每次当put时,如果容量满,将最久未使用的节点删除。设LRU输入最近访问列表的容量 和 操作次数。

weixin_73915013的博客 514

Windows下Python多版本共存与切换的终极指南(含环境变量详解)

本文详细解析了在Windows系统下实现Python多版本共存与切换的完整方案。通过深入讲解环境变量Path的底层机制,提供了从安装策略、精细化Path管理到创建快速切换脚本的实战指南,并介绍了py启动器和虚拟环境等高级技巧,帮助开发者彻底解决版本冲突问题,提升开发效率。

v6b7n8m9q0的博客 537

经纬度转换为UTM坐标

UTM(通用横向墨卡托投影): 是一种以米为单位的坐标系统,用于地图和GPS导航。将地球划分为60个纵向的区域。每个区域宽6度,从赤道开始往南北两级方向划分。每个区域都有一个特定的字母。

weixin_45626706的博客 7275

146.LRU 缓存

那么,什么样的数据,我们判定为「有用的」的数据呢?首先要接收一个 capacity 参数作为缓存的最大容量,然后实现两个 API,一个是 put(key, val) 方法存入键值对,另一个是 get(key) 方法获取 key 对应的 val,如果 key 不存在则返回 -1。LRU 的全称是 Least Recently Used,也就是说我们认为最近使用过的数据应该是是「有用的」,很久都没用过的数据应该是无用的,内存满了就优先删那些很久没用过的数据。链表有顺序之分,插入删除快,但是查找慢。

weixin_42029738的博客 311

手把手教你搭建三端口DC-DC变换器(含Boost+Buck电路实战)

本文详细介绍了如何从零开始搭建三端口DC-DC变换器,涵盖Boost和Buck电路的硬件设计、元器件选型、电路板布局、焊接技巧、控制系统设计与调试等关键步骤。通过实战案例和优化建议,帮助工程师避开常见陷阱,提升系统效率和稳定性,适用于光伏、储能等电力电子应用场景。

x8y9z0的博客 929

[LeetCode 146 LRU Cache] 最近最少使用缓存(一) _ 刷题打卡

作为一名从事Android的开发者,很多人最近都在和我吐槽Android是不是快要凉了?而在我看来这正是市场成熟的表现,所有的市场都是温水煮青蛙,永远会淘汰掉不愿意学习改变,安于现状的那批人,希望所有的人能在大浪淘沙中留下来,因为对于市场的逐渐成熟,平凡并不是我们唯一的答案!《互联网大厂面试真题解析、进阶开发核心学习笔记、全套讲解视频、实战项目源码讲义》点击传送门即可获取!《互联网大厂面试真题解析、进阶开发核心学习笔记、全套讲解视频、实战项目源码讲义》点击传送门即可获取!

2401_84149855的博客 1018

2️⃣ Coze创建智能体教学(2025年全新版本)

扣子平台提供强大支持,可将智能体轻松集成至各类社交平台,使智能体得以服务更为庞大的用户群体。当下支持集成的平台如下:​1️⃣豆包:作为聚焦 AI 内容创作的平台,非常适合发布充满创意、娱乐性强的智能体。​2️⃣飞书:适合发布用于办公协作的智能体,助力团队提升工作效率。​3️⃣微信:借助公众号或小程序的形式,能够服务海量微信用户。​4️⃣抖音:适合发布与短视频相关的智能体,为用户提供创意与娱乐服务。​

李同学Lino的博客 4576

诊断CAPL自动化(5) ——没有CANdela,无法编辑cdd数据库文件,也能轻松完成诊断测试

🍅我们知道cdd数据库文件,是CANoe测试环境的重要组件,它可以让我们更加轻松的完成诊断测试工作;但是创建和编辑cdd文件是需要CANdela 来完成的,一个 liscense 就要将近二十万,成本确实高🍅特别是在处理22/2E/31服务的时候,频繁的增加功能,可能需要频繁的用CANdela 修改CDD,我测试开发过程中,一般很少去修改cdd,有这个时间,纯手撸也开发完了,就一个CANdela,鬼知道此时此刻到了谁手里,我也懒得去找。🍅演示软硬件环境;目录📘前言。

蚂蚁小兵 5756

LRU Cache 最近最少使用页面置换缓存器

好的设计和算法 最近最少使用页面置换缓存器,常用的一种存储算法 #include #include #include<unordered_map> using namespace std; class LRUCache { LRUCache(int cap) { this->cap = cap; } int get(int key) { auto iter = m.find(k...

weixin_41157881的博客 180

OTFS 消息传递算法信号检测【附matlab代码详解】

OTFS 消息传递算法方面的一些浅浅理解。

Cuby的博客 4011

146 LRU Cache 最近最少使用页面置换算法

设计和实现一个 LRU(最近最少使用)缓存 数据结构,使它应该支持以下操作: get 和 put 。get(key) - 如果密钥存在于缓存中,则获取密钥的值(总是正数),否则返回 -1。put(key, value) - 如果密钥不存在,请设置或插入值。当缓存达到其容量时,它应该在插入新项目之前使最近最少使用的项目作废。后续:你是否可以在 O(1) 时间复杂度中进行两种操作?案例:LRUCac...

weixin_30323961的博客 137

STM32入门教程:智能马桶盖控制

通过编写相应的代码,您可以根据需要实现其他功能,例如座圈温度调节和液晶显示屏显示等。初始化配置 首先,使用STM32CubeMX创建一个新的工程,并选择您所使用的STM32单片机型号。智能马桶盖是一种集成了多种功能的智能家居设备,通过控制芯片来实现自动冲水、座圈加热、座圈温度调节等功能。在本教程中,我们将使用STM32系列单片机来控制智能马桶盖的各个功能。以上代码演示了如何通过STM32的GPIO控制引脚来控制智能马桶盖的冲水和座圈加热功能。写代码 接下来,我们将通过编写代码来控制智能马桶盖的各个功能。

2401_85258012的博客 657

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

LeetCode 146. LRU 缓存机制(LRU Cache)

易错点正确做法说明更新数据未移动位置保证“最近使用”put 超过容量未淘汰使用删除头部get 不存在时返回错误返回-1使用是 Python 实现 LRU 的最简洁且效率最高的方式。同时掌握哈希表 + 双向链表手动实现 LRU 也是面试时加分项。本题考查的是缓存机制 + 数据结构的组合使用,属于高频面试题之一。错误点正确方式删除时未断开前后节点_remove()正确处理 prev/next忘记从cache删除淘汰节点双向链表头尾更新顺序错误始终更新 prev/next 的双向性。

2501_91641025的博客 1069

Outlook Express 6 (OE6) for Win7/Win8/Win10

英文版 Outlook Express6.0, 兼容Win7/Win10/WinXP,解压就可用。

【算法】LRU缓存算法的C++实现

LRU缓存算法是一种淘汰算法,也是一道经典的面试题,本文对LRU缓存算法的C++实现做了讲解。

Conner7的博客 6653

锂电池充电器电路设计 里面有电路

锂电池充电器电路设计 里面有电路 3.7V升压到5V电路设计。

LinePhone3.2.7(android端最新版本) sip客户端

SIP客户端For android:LinePhone3.2.7(最新版本),官网地址:http://www.linphone.org/

【LeetCode 热题 100】146. LRU 缓存——哈希表+双向链表

Problem:题目:请你设计并实现一个满足 LRU (最近最少使用) 缓存 约束的数据结构。实现 LRUCache 类:LRUCache(int capacity) 以 正整数 作为容量 capacity 初始化 LRU 缓存int get(int key) 如果关键字 key 存在于缓存中,则返回关键字的值,否则返回 -1。void put(int key, int value) 如果关键字 key 已经存在,则变更其数据值 value;

最短的捷径就是绕远路,绕远路才是我的最短捷径。 1256

LeetCode 146. LRU Cache 题解

本题是 LRU 缓存的经典实现。双向链表维护使用顺序哈希表实现 O(1) 查找虚拟头尾节点简化操作移动节点到头部表示最近使用删除尾部节点表示逐出最久未使用。

cannonjinx的博客 2375

LeetCode146:LRU缓存

LRU 的全称是 Least Recently Used,也就是说我们认为最近使用过的数据应该是是「有用的」,很久都没用过的数据应该是无用的,内存满了就优先删那些很久没用过的数据。1、显然 cache 中的元素必须有时序,以区分最近使用的和久未使用的数据,当容量满了之后要删除最久未使用的那个元素腾位置。如果我们每次默认从链表尾部添加元素,那么显然越靠尾部的元素就是最近使用的,越靠头部的元素就是最久未使用的。LRU 缓存算法的核心数据结构就是哈希链表,双向链表和哈希表的结合体。手机管家-后台程序管理。

1333

LRU Cache

LRU Cache

qq_67582098的博客 1318
上一篇: LeetCode-4:Median of Two Sorted Arrays (两个排序数组的中位数)
下一篇: LeetCode-382:Linked List Random Node (随机返回链表结点)
大树先生的博客
博客等级 码龄9年 2692粉丝 200原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值