Leetcode 146. LRU 缓存

embedded/2024/9/20 3:27:34/ 标签: leetcode, 缓存, 算法

在这里插入图片描述

注意的点:

1、这道题本质是要求一个可以排序的字典(因为O(1)的时间复杂度就是字典),所以要不就用collections自带的OrderDict,要不然就用字典加双头链表自己实现一个。
2、OrderedDict的两个方法:
.move_to_end(key, last=False):把元素后移一位,last=True的话就是移动到最后
.popitem(last=True):把最后位置的元素pop出去

解法一:python的OrderDict

from collections import OrderedDictclass LRUCache:def __init__(self, capacity: int):self.capacity = capacityself.cache = OrderedDict()def get(self, key: int) -> int:if key in self.cache:self.cache.move_to_end(key, last=False)return self.cache[key]else:return -1def put(self, key: int, value: int) -> None:self.cache[key] = valueself.cache.move_to_end(key, last=False)if len(self.cache) > self.capacity:self.cache.popitem(last=True)
# Your LRUCache object will be instantiated and called as such:
# obj = LRUCache(capacity)
# param_1 = obj.get(key)
# obj.put(key,value)

解法二:字典加双链表

class LRUCache:def __init__(self, capacity: int):self.max = capacityself.store = dict()  self.head = Linknode(None, None)self.tail = self.headdef get(self, key: int) -> int:if key not in self.store.keys():return -1self.addcurrentnode2tail(key)return self.store[key]def put(self, key: int, value: int) -> None:if key not in self.store.keys():node = Linknode(None, key)self.tail.next = node# self.tail = self.tail.nextself.tail = nodeif len(self.store.keys()) == self.max:tempnode = self.head.nextremoved_key = tempnode.valself.head.next = tempnode.nexttempnode.next = Noneself.store.pop(removed_key)self.store[key] = valueelse:  # 找到这个self.addcurrentnode2tail(key)self.store[key] = valuedef addcurrentnode2tail(self, akey):print(889, self.head)hi = self.headwhile hi.next:if hi.next.val == akey:breakhi = hi.next# 把hi移动到链表的尾部(可能已经是末尾了)if hi.next.next:temp = hi.next.nexthi.next.next = Noneself.tail.next = hi.nexthi.next = tempself.tail = self.tail.nextclass Linknode:def __init__(self, ne=None, val=None):self.next = neself.val = val
# Your LRUCache object will be instantiated and called as such:
# obj = LRUCache(capacity)
# param_1 = obj.get(key)
# obj.put(key,value)

http://www.ppmy.cn/embedded/104328.html

相关文章

汽车一些身份认证技术术语

一、技术概述 基于5G-V2X车路协同场景的身份认证技术,主要通过建立完整的身份认证体系和安全信任机制,确保车辆与道路基础设施之间、车辆与车辆之间以及车辆与云端之间的通信安全。该技术利用5G网络的通信能力,结合数字证书、密钥管理、加密…

TCP并发服务端的实现

思想:创建多个套接字,由"我"来管理这些套接字 方法: 1.多进程 2.多线程 3.IO多路复用 tcp服务器端创建流程: socket() bind() listen() connfd accept IO多路复用: 多个文件I复用同一个进程 IO…

idea插件开发(一)合并检查

一、引言 由于代码合并冲突的时候,代码丢失的情况频发,作者研究idea的VFS虚拟文件系统和Git4ide源码,创作idea插件检测代码合并丢失 可以区分主动删除与被动丢失,比如本地或者删除一段代码,合并之后不会被认为是丢失…

【HuggingFace Transformers】Bert Model的应用

Bert Model的应用 1. Sequence分类1.1 主要模块1.2 应用场景1.3 BertForSequenceClassification 源码解析 2. Token分类2.1 主要模块2.2 应用场景2.3 BertForTokenClassification 源码解析 3. 两种分类对比 在自然语言处理领域中,BERT 模型因其强大的文本理解能力被…

SpringBoot 基于iText 根据PDF模板动态生成文件

SpringBoot 基于iText 根据PDF模板动态生成文件, 需要使用 adobe acrobat pro DC这个工具来自定义模板 支持根据PDF模板生成单页或多页PDF文件 adobe acrobat pro DC 自定义模板 下载地址 链接:https://pan.baidu.com/s/1Vn3bIQ5_D17sEZnkF2t7gg?pwdn6o1 提取码…

Linux C自定义调试打印方法(用户态、内核态)

Linux C自定义调试打印方法(用户态、内核态) 前言用户态内核态 前言 在调试内核和驱动时,你是否会遇到不会加打印的烦恼,直接print后,由于添加的打印太多,没办法做到统一开启关闭debug的作用,下…

微信小程序 跳转

普通跳转 wx.navigateTo({url: /pages/xxx/xxx }) 返回 wx.navigateBack({})wx.navigateBack({delta: 0 }) 关闭当前页并跳转 wx.redirectTo({url: pages/xxx/xxx }) 切换主菜单 wx.switchTab({url: ../store/index }) 小程序跳转 wx.navigateToMiniProgram({appId: xx…

python基本语法总结

参考: Python 基础语法 | 菜鸟教程 (runoob.com) Python 语言与 Perl,C 和 Java 等语言有许多相似之处。但是,也存在一些差异。 在本章中我们将来学习 Python 的基础语法,让你快速学会 Python 编程。 第一个Python程序 python编写…

Redis 键值对操作全攻略

文章目录 一 . get 和 set二 . keys *三 . exists四 . del五 . expire六 . ttl七 . Redis 的 key 的过期策略八 . 定时器的实现8.1 基于优先级队列8.2 基于时间轮实现的定时器 九 . type十 . 数据库管理相关命令 Hello , 大家好 , 这个专栏给大家带来的是 Redis 系列 ! 本篇文章…

《深入理解JAVA虚拟机(第2版)》- 第6章 - 学习笔记

第6章 类文件结构 6.1 概述 字节码和二级制本地机器码(Native Code)是用来存储程序编译后的结果的,是二种程序存储结构。 6.2 无关性的基石 这里说的无关性,分为:平台无关性和语言无关性。 平台无关性:…

数学基础 -- 线性代数之伴随矩阵

伴随矩阵 1. 代数余子式 首先我们需要理解什么是代数余子式。对于一个 n n n \times n nn 的方阵 A A A,代数余子式 M i j M_{ij} Mij​ 是指从矩阵 A A A 中删除第 i i i 行和第 j j j 列后,剩下的子矩阵的行列式。 假设有一个 3 3 3 \time…

SSL证书如何保护IP地址的安全

SSL证书在保护IP地址安全方面起着至关重要的作用,主要通过以下几个方面来实现: 一、数据加密功能 SSL证书为通过IP地址进行的通信提供数据加密功能。这意味着,当数据通过IP地址在客户端和服务器之间传输时,SSL证书能够确保这些数…

数分基础(04)EXCEL常用快捷键-中等规模数据不用拼命滚轮

文章目录 1. 说明2. EXCEL常用快捷键 1. 说明 Excel适用于较小的或者中等规模的数据集,行数限制为1,048,576行,≥104万。 但很可能未及这个上限时,性能就显著下降,一般远低于此行数限制才比较流畅性,例如10万。 中小…

如何根据安装源码手动安装依赖

Homebrew 配方(Formula)核心部分: 1. url & sha256 用途: 指定软件包的下载地址和校验和,用于确保下载文件的完整性。示例: url "https://example.com/download/tool-1.0.0.tar.gz" sha256 "3bcbdbb9a50cc6f…

浅谈C#委托

一、基本介绍 委托是一种引用类型,它表示对方法的引用,即委托就是一种用来指向一个方法的引用类型变量。 委托(Delegate)是一种特殊的类型,它定义了方法的类型,使得可以将方法作为参数传递,或者…

Java EE

Java EE 包含JavaSE 增加一些新的API 构建一个后端服务 网页->web服务器->java后端 web后端(javaEE)程序需要运行在服务器中的,这样前端才可以访问得到 服务器:是容器,是连接用户和程序之间的中间件 解释1:一款软件&#…

网络原理基本概念

一.IP地址和端口号 IP地址指的是一台主机在互联网中所处的位置,相当于我们网购时填写的收货地址。IP地址是通过32位整数来进行表示的,为了方便查看,就使用了点分十进制的方式来进行表示IP地址。用户可以在电脑中使用cmd来看自己本台机器的IP地…

【Linux】进程概念

【Linux】进程概念 1. 基本概念2. 描述进程-PCB2.1 task_struct-PCB的一种2.2 task_ struct内容分类 3. 组织进程3.1 查看进程 4. 通过系统调用获取进程标示符4.1 获取进程标识符4.2 更改工作目录chdir 5 通过系统调用创建进程-fork初识5.1 接口认识5.2 返回值分析 1. 基本概念…

一种导出PPT到MP4的方法

需求 导出PPT到MP4,并记录每页,每个动作的时间线。通过 MP4时间线 就可以在页面上很方便的放映PPT的内容,并支持翻页点击。 代码 保存每一页的图像信息,用做播放器的缩略图 public void SaveThumbnail(string ppt_filepath, st…

SpringBoot+Grafana+Prometheus+Docker-Compose 快速部署与JVM监控的快速入门的简单案例

1. Java项目 1.1 项目结构 1.2 pom.xml <?xml version"1.0" encoding"UTF-8"?> <project xmlns"http://maven.apache.org/POM/4.0.0" xmlns:xsi"http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation"htt…