【重点】LeetCode 146. LRU Cache

【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... 阅读详情

LeetCode 146. LRU Cache

1.Solution1

本博客转载自:http://www.cnblogs.com/grandyang/p/4587511.html
这道题让我们实现一个LRU缓存器,LRU是Least Recently Used的简写,就是最近最少使用的意思。那么这个缓存器主要有两个成员函数,get和put,其中get函数是通过输入key来获得value,如果成功获得后,这对(key, value)升至缓存器中最常用的位置(顶部),如果key不存在,则返回-1。而put函数是插入一对新的(key, value),如果原缓存器中有该key,则需要先删除掉原有的,将新的插入到缓存器的顶部。如果不存在,则直接插入到顶部。若加入新的值后缓存器超过了容量,则需要删掉一个最不常用的值,也就是底部的值。具体实现时我们需要三个私有变量,cap, l和m,其中cap是缓存器的容量大小,l是保存缓存器内容的列表,m是哈希表,保存关键值key和缓存器各项的迭代器之间映射,方便我们以O(1)的时间内找到目标项。
然后我们再来看get和put如何实现,get相对简单些,我们在m中查找给定的key,如果存在则将此项移到顶部,并返回value,若不存在返回-1。对于put,我们也是现在m中查找给定的key,如果存在就删掉原有项,并在顶部插入新来项,然后判断是否溢出,若溢出则删掉底部项(最不常用项)。代码如下:

class LRUCache{
public:
    LRUCache(int capacity) {
        cap = capacity;
    }

    int get(int key) {
        auto it = m.find(key);
        if (it == m.end()) return -1;
        l.splice(l.begin(), l, it->second);//把it->second迭代器指的元素挪到l的开始位置
        return it->second->second;
    }

    void put(int key, int value) {
        auto it = m.find(key);
        if (it != m.end()) l.erase(it->second);
        l.push_front(make_pair(key, value));
        m[key] = l.begin();
        if (m.size() > cap) {
            int k = l.rbegin()->first;
            l.pop_back();
            m.erase(k);
        }
    }

private:
    int cap;
    list<pair<int, int>> l;
    unordered_map<int, list<pair<int, int>>::iterator> m;
};

2.c++中list的splice()函数

关于c++中list的splice函数用法参考链接:http://www.cplusplus.com/reference/list/list/splice/
示例代码:

// splicing lists
#include <iostream>
#include <list>

int main ()
{
  std::list<int> mylist1, mylist2;
  std::list<int>::iterator it;

  // set some initial values:
  for (int i=1; i<=4; ++i)
     mylist1.push_back(i);      // mylist1: 1 2 3 4

  for (int i=1; i<=3; ++i)
     mylist2.push_back(i*10);   // mylist2: 10 20 30

  it = mylist1.begin();
  ++it;                         // points to 2

  mylist1.splice (it, mylist2); // mylist1: 1 10 20 30 2 3 4
                                // mylist2 (empty)
                                // "it" still points to 2 (the 5th element)

  mylist2.splice (mylist2.begin(),mylist1, it);
                                // mylist1: 1 10 20 30 3 4
                                // mylist2: 2
                                // "it" is now invalid.
  it = mylist1.begin();
  std::advance(it,3);           // "it" points now to 30

  mylist1.splice ( mylist1.begin(), mylist1, it, mylist1.end());
                                // mylist1: 30 3 4 1 10 20

  std::cout << "mylist1 contains:";
  for (it=mylist1.begin(); it!=mylist1.end(); ++it)
    std::cout << ' ' << *it;
  std::cout << '\n';

  std::cout << "mylist2 contains:";
  for (it=mylist2.begin(); it!=mylist2.end(); ++it)
    std::cout << ' ' << *it;
  std::cout << '\n';

  return 0;
}

输出:
mylist1 contains: 30 3 4 1 10 20
mylist2 contains: 2
汇川H5U搭配步进伺服电机使用CANopen通讯控制电机案例 摘要:本文介绍了基于汇川H5U PLC和STM4260B-CANopen-M步进伺服电机的控制系统搭建流程。主要内容包括:硬件准备(PLC、伺服电机、24V电源)、电机参数默认设置(地址1号、1M波特率)、使用AutoShop软件编写程序(配置CANopen参数、导入电机描述文件、设置PDO参数)以及功能块编程(使能控制、速度控制、绝对位置控制等)。通过查阅通讯手册完成各功能块参数配置,最终在主程序中调用功能块实现控制系统开发。该方案适用于需要精确运动控制的工业自动化场景。 阅读详情

相关推荐

Claude Desktop Cowork国内实操指南:本地文件自动化办公

大语言模型正从‘问答式AI’迈向‘执行型协作者’,其核心能力在于直接操作本地文件、调用系统工具并嵌入真实工作流。Claude Desktop的Cowork模式正是这一范式的代表,它通过轻量沙箱VM实现对Excel、PPT、PDF、音视频等办公资产的读写与处理,无需手动编码即可完成数据清洗、会议纪要生成、自动化报告输出等任务。技术价值体现在权限可控、环境隔离、结果可交付;典型场景覆盖行政文秘的文档流转、销售运营的数据分析、开发者的脚本调试与环境验证。本文聚焦国内用户高频卡点——网络链路、系统权限与工作流断层,

weixin_30617737的博客 466

LeetCode 146. LRU缓存机制(java实现)

参考解答 总结:这道题主要要知道选取何种数据结构并且在 O(1) 时间复杂度内完成这两种操作? O(1) 的get方法肯定要用到HashMap() LinkedList(双向链表)可以以O(1)时间复杂度,很方便地实现数据的插入和删除 所以,将两个数据结构联合使用,HashMap中的(key,value)存储的是(key,Node); Node中储存的数据是双向链表节点信息,包括key,...

ccccc1997的博客 2467

Unity游戏Mono注入实战:从反编译到功能扩展

本文详细介绍了Unity游戏Mono注入的完整实战流程,从使用dnSpy反编译游戏核心逻辑,到编写自定义C#功能DLL,再到利用SharpMonoInjector进行动态注入。文章深入讲解了如何通过Harmony库拦截修改游戏方法,并介绍了使用MelonLoader框架和UnityExplorer进行高级模组开发与调试,最终通过一个游戏对象透视(ESP)案例演示了功能扩展的实现。

weixin_29018335的博客 458

Java | Leetcode Java题解之第146题LRU缓存

Java | Leetcode Java题解之第146题LRU缓存

m0_57195758的博客 669

零信任架构实战:“持续验证+动态授权”全流程解析(附策略引擎联动图)

《零信任实战指南:7图拆解核心流程与行业案例》摘要:本文通过7张架构图系统解析零信任五大核心流程:强身份认证、设备检查、动态授权、持续监控和自动降权。对比金融(重数据审计)与制造业(重物理绑定)的落地差异,指出三大常见误区及解决方案。数据显示,零信任可使安全响应提速60%,泄露成本降低45%。文章提供6个月实施路线图,强调零信任是"智能信任"体系,建议企业分阶段改造,优先保护核心系统。附赠金融/制造行业策略模板及甘特图示例。(149字)

sara_han的博客 773

Ubuntu下为RK3568开发板搭建Qt交叉编译环境:手把手教你配置Qt Creator和远程调试

本文详细介绍了在Ubuntu系统下为RK3568开发板搭建Qt交叉编译环境的完整流程,包括工具链配置、Qt源码交叉编译、Qt Creator环境设置以及远程调试技巧。通过手把手教程,开发者可以快速掌握RK3568平台的Qt开发环境搭建方法,实现高效的应用开发和部署。

weixin_30776273的博客 373

算法:leetcode_146_LRU 缓存

本文详细介绍了LRU(最近最少使用)缓存的设计与实现。通过双向循环链表和哈希表的结合,实现了O(1)时间复杂度的get和put操作。核心实现包括:1)使用双向链表维护访问顺序;2)利用哈希表实现快速查找;3)定义disconnect和pushFront方法维护链表结构;4)处理容量满时的淘汰策略。

bugMaker_0621的博客 1245

避坑指南:Qgis等时圈分析中ORS插件Key申请与参数设置的常见错误

本文详细解析了QGIS等时圈分析中ORS插件从API密钥申请到参数优化的全流程避坑指南。针对密钥激活、出行模式选择、时空参数设置等七个高频故障点,提供了实用的调试方案和优化技巧,帮助用户高效完成空间可达性分析。

weixin_42546508的博客 299

leetcode146.手撸 LRU 算法(java)

LRU 缓存淘汰算法就是一种常用策略。LRU 的全称是 Least Recently Used,也就是说我们认为最近使用过的数据应该是是「有用的」,很久都没用过的数据应该是无用的,内存满了就优先删那些很久没用过的数据。

SP_1024的博客 486

04目标检测-Two-stage的目标检测算法

前面我们对进行了对比分析,同时上一篇我们介绍了传统算法在目标检测的原理和效果,此篇我们记录了我学习目标检测算法的深度,深入讲述一下深度学习算法在目标检测的原理和效果。原文链接:https://blog.csdn.net/qq_41946216/article/details/132800752。版权声明:本文为优快云博主「爱吃面的猫」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。One-stage(YOLO和SSD系列):直接回归目标位置。

qq_41946216的博客 3650

光学传播仿真软件:ASAP_(1).ASAP软件介绍与安装

ASAP(Advanced System for Analysis and Propagation)是一款强大的光学传播仿真软件,广泛应用于光学系统的设计、分析和优化。它提供了丰富的建模工具和仿真功能,可以帮助用户从简单的光学元件到复杂的光学系统进行仿真。:支持光学、机械、热学等多物理场的联合仿真。:采用高精度的算法,确保仿真结果的准确性。:内置了大量的光学元件,如透镜、反射镜、棱镜、光栅等。:提供直观的用户界面,支持多种建模和仿真方式。:支持使用脚本语言进行二次开发,增强软件的定制能力。

kkchenjj的博客 1590

【leetcode】146.LRU缓存机制 (哈希表+双向链表,java实现)

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

Viper的程序员修炼手册 764

Autosar MCAL-S32k324 Crypto配置-基于EB

NXP官网提供了免费的HSE固件,同时也提供了对应的协议栈。本文以算法为例,介绍MCAL相关的配置及在代码中的集成与使用。使用HSE计算,比软件算法确实方便许多。后面会完善更多的算法测试。

赞的博客 2434

linux cache lru回收,LRU cache 算法

上周末同学问了一些操作系统的问题,涉及到LRU cache,顺便复习了一下。LRU是least recently used的缩写,意思是最近最少使用,是一种内存页面置换算法。根据程序设计局部性的原则,如果一个页面在最近的一段时间一直没有被使用,那这个页面在将来一段时间内不会被用到的概率就比较大;同样的,如果一个页面最近频繁的被使用,那它在接下来也有很大概率会被用到(例如循环)。LRU 算法的基本原...

weixin_39956558的博客 200

efm32 入门.pdf

本PDF共计22页,介绍的是操作驱动API,下载与否自己斟酌。

ET2012新版免狗免安装绿色软件

ET2012新版免狗免安祖昂绿色软件。,新界面,新视觉,

Leetcode 146. LRU Cache

Leetcode 146. LRU Cache题目:解法1:ordered dictionary解法2:Hashmap+double linked list 题目: 解法1:ordered dictionary 用python内置的工具,关于这种解法不做详述,因为LRU这个题目肯定还是要要考察他的具体实现的,所以这种解法参考Leetcode官方即可: https://leetcode.com/problems/lru-cache/solution/ 解法2:Hashmap+double linked li

qq_37821701的博客 358

假人有限元模型

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

[leetcode] 146. LRU Cache

感想 这道题在leetcode是hard的难度,通过率只有21.2%,我记得在某次笔试的时候做到了这一道题,那时候做得不怎么好,我这里把记录一下我以前写的代码,就当复习一下 题目 Design and implement a data structure forLeast Recently Used (LRU) cache. It should support the following ...

Learning from the mistakes 462

链表刷题下篇:排序、合并K链表与LRU Cache的踩坑全记录

这篇文章是链表系列下篇,复盘 LeetCode 148、23、146 三道题的解题思路和真实踩坑经历,帮你避开我犯过的那些低级错误。上篇讲了链表基础操作,这篇难度上了一个台阶:归并排序、多路合并、LRU 缓存,每道题都能单独出一道面试题。堆里始终只放 k 个节点,不是 N 个。每次弹出一个节点,把它的下一个节点放进来,堆的大小始终 ≤ k。每次堆操作 O(log k),共 N 个节点,总计 O(N log k)。如果把所有节点全倒进堆再排,那才是 O(N log N),没有利用链表已有序这个条件。

2401_87961121的博客 441

字节跳动面试题深度拆解:2年真题数据告诉你,大厂算法面试到底怎么准备

深夜十一点,朋友阿凯发来一条消息:"字节二面挂了,但面试官出的题,我总觉得在哪见过。"他翻出聊天记录里的三道题,对照一份开源项目 LeetCode-Questions-CompanyWise 里的 `bytedance_2year.csv`,发现其中两道赫然在列——这份按面试频率排序的字节跳动面试题清单,记录着近2年真实考过的117道算法题。从那一刻起,我决定不再把"刷题"当玄学,而是把它当成一次

gitblog_00965的博客 317

LeetCode 146. LRU Cache 题解

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

cannonjinx的博客 2374

LeetCode 146 LRU Cache

本文记录本人在解决 LeetCode 第146题 LRU Cache 过程中的收获。主要是增加了对 C++ STL list 容器的了解。点击该链接可跳转到 LeetCode 此题目处。本文借鉴了花花酱 的个人网站的讲解和代码。本文相当于对花花酱的代码的注释。 需要解决的题目属于模拟题,即模拟出 Least Recently Used Cache 的运行机制。由于题目对 get()、put()函数时间复杂度都做了 常数级的限制。所故题目的难点主要落在用什么数据结构上。在这里直接给出结论,使用一个 list

OrdinaryMatthew的博客 321

146. LRU Cache

【代码】146. LRU Cache。

weixin_41554427的博客 473

其它高阶数据结构④_LRU_Cache(概念+实现OJ)

其它高阶数据结构④_LRU_Cache(概念+实现OJ)

参考书籍:《C语言程序设计》《数据结构》《C++ Primer》《Effective C++》《STL源码剖析》《现代操作系统》《UNIX环境高级编程》《图解TCP/IP》《图解HTTP》《Linux高性能服务器编程》《剑指Offer》《算法导论》 1123

【数据结构】LRU Cache {什么是LRU Cache?LRU Cache的实现}

【数据结构】LRU Cache {什么是LRU Cache?LRU Cache的实现}

52Herzt的博客 863

【算法】Java实现LRU Cache 缓存 LeetCode146

LRU (Least Recently Used) Cache 最近最少使用的缓存。 实现思想:借用双链表和map实现,双链表保存实际的值,map用来保存key和链表节点的映射关系。 class LRUCache { int capacity; // 保护节点 Node head; Node tail; Map<Integer, Node> cache = new HashMap<>(); public LRUCache(in

未闻花名丶的博客 1104

LeetCode 146. LRU 缓存

LeetCode 146. LRU 缓存

脚踏实地,仰望星空 609
上一篇: 【To Do 难点】最大搜索二叉树
下一篇: 【回文串3】LeetCode 125. Valid Palindrome
Allenlzcoder
博客等级 码龄10年 925粉丝 512原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值