LeetCode146: LRU缓存

题目描述
请你设计并实现一个满足 LRU (最近最少使用) 缓存 约束的数据结构。
实现 LRUCache 类:
LRUCache(int capacity) 以 正整数 作为容量 capacity 初始化 LRU 缓存
int get(int key) 如果关键字 key 存在于缓存中,则返回关键字的值,否则返回 -1 。
void put(int key, int value) 如果关键字 key 已经存在,则变更其数据值 value ;如果不存在,则向缓存中插入该组 key-value 。如果插入操作导致关键字数量超过 capacity ,则应该 逐出 最久未使用的关键字。
函数 get 和 put 必须以 O(1) 的平均时间复杂度运行。

示例
示例:
输入
[“LRUCache”, “put”, “put”, “get”, “put”, “get”, “put”, “get”, “get”, “get”]
[[2], [1, 1], [2, 2], [1], [3, 3], [2], [4, 4], [1], [3], [4]]
输出
[null, null, null, 1, null, -1, null, -1, 3, 4]

解释
LRUCache lRUCache = new LRUCache(2);
lRUCache.put(1, 1); // 缓存是 {1=1}
lRUCache.put(2, 2); // 缓存是 {1=1, 2=2}
lRUCache.get(1); // 返回 1
lRUCache.put(3, 3); // 该操作会使得关键字 2 作废,缓存是 {1=1, 3=3}
lRUCache.get(2); // 返回 -1 (未找到)
lRUCache.put(4, 4); // 该操作会使得关键字 1 作废,缓存是 {4=4, 3=3}
lRUCache.get(1); // 返回 -1 (未找到)
lRUCache.get(3); // 返回 3
lRUCache.get(4); // 返回 4

解题思想
1、使用双向链表
2、使用HashMap
将最近使用的放到链表头部,如果超过容量就将最尾部的删除掉。

代码

class LRUCache {
public://定义双向链表struct Node {int key, val;Node* next, * prev;Node(): key(0), val(0), prev(nullptr), next(nullptr){};Node(int _key,int _val):key(_key),val(_val), prev(nullptr), next(nullptr) {};};//链表的首尾节点Node* head, *tail;//key和结点的映射关系unordered_map<int, Node*> umap;int capacity,size; //容量大小和已经使用的大小LRUCache(int capacity) {//初始化this->capacity = capacity;this->size = 0;head = new Node();tail = new Node();head->next = tail;tail->prev = head;}int get(int key) {//如果不存在返回-1if (!umap.count(key))return -1;Node* node = umap[key];removeNode(node);addNodeToHead(node);return node->val;}void put(int key, int value) {//如果链表中key存在,就修改value的值,然后再插入到表头if (umap.count(key)) {Node* node = umap[key];node->val = value;removeNode(node);addNodeToHead(node);}//如果不存在else {//如果容量不够,就先删除最久未使用的,然后再创建一个新的结点if (capacity == size) {Node* removed = tail->prev;//从哈希表中删除最久未访问的umap.erase(removed->key);//从链表中也删除removeNode(removed);size--;}//新创建一个节点Node* node = new Node(key, value);addNodeToHead(node);umap[key] = node;size++;}}//删除当前节点void removeNode(Node* node) {node->prev->next = node->next;node->next->prev = node->prev;}//添加到表头void  addNodeToHead(Node* node) {node->prev = head;node->next = head->next;head->next->prev = node;head->next = node;}
};

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/700045.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

RabbitMQ的死信队列和延迟队列

文章目录 死信队列如何配置死信队列死信队列的应用场景Spring Boot实现RabbitMQ的死信队列 延迟队列方案优劣&#xff1a;延迟队列的实现有两种方式&#xff1a; 死信队列 1&#xff09;“死信”是RabbitMQ中的一种消息机制。 2&#xff09;消息变成死信&#xff0c;可能是由于…

绿盾限制终端网络访问权限会恢复后,别的网站访问正常就是无法访问钉钉网站和下载东西

环境&#xff1a; Win10 专业版 钉钉7.5.5 绿盾7.0 问题描述&#xff1a; 绿盾限制终端网络访问权限会恢复后&#xff0c;别的网站访问正常就是无法访问钉钉网站和下载东西 解决方案&#xff1a; 排查方法 1.重置浏览器或者更换浏览器测试&#xff08;未解决&#xff09…

【Java】输入输出流(实验八)

目录 一、实验目的 二、实验内容 三、实验小结 一、实验目的 1、掌握java I/O的基本原理。 2、掌握标准输入输出流和Scanner类的基本使用方法。 3、掌握FileInputStream、FileOutStream、FileReader、FileWriter、BufferedReader 、BufferedWriter类的常用方法。 二、实验…

VR系统的开发流程

虚拟现实&#xff08;Virtual Reality&#xff0c;VR&#xff09;系统是一种通过计算机技术模拟出的具有三维视角和交互性的虚拟环境&#xff0c;使用户能够沉浸在其中并与虚拟环境进行交互。这种技术通常利用头戴式显示器和手柄等设备&#xff0c;使用户能够感觉到仿佛身临其境…

【kubernetes】kubeadm部署k8s集群(3主3从+keepalived/nginx负载均衡高可用)

目录 一、完成系统初始化 步骤一&#xff1a;常规环境初始化 步骤二&#xff1a;内核版本升级以及内核限制文件参数修改 步骤三&#xff1a;提前准备好负载均衡器和keepalived(接着之前的二进制部署修改的) 二、所有节点部署docker&#xff0c;以及指定版本的kubeadm 步骤…

Mysql系列之命令行登录、连接工具登录、数据库表常用命令

登录与常用命令 连接工具登录命令行登录数据库1、查看数据库2、指定数据库3、查看当前数据库4、建库语句 数据表1、查看数据表2、查看表结构信息3、查看建表语句4、建表语句 连接工具登录 首先下载mysql连接工具&#xff0c;解压后直接打开软件&#xff0c;按以下步骤操作&…

CSS实现半边边框(只有边框的部分可见)

CSS实现半边边框&#xff08;只有边框的部分可见&#xff09; <div class"part box"><h1>内容</h1><!-- 绘出下面两个对角边框--><div class"part-footer"></div> </div>主要代码 .box {width: 100px;height:…

RabbitMq:什么是RabbitMq? ①

一、RabbitMq定位 RabbitMq是一个基于消息订阅发布的一款消息中间件。 二、技术原理 核心概念 server&#xff1a;又称broker&#xff0c;接受客户端连接&#xff0c;实现AMQP实体服务。缓存代理&#xff0c;Kafka集群中的一台或多台服务器统称broker.connection&#xff1a;…

【Java学习笔记】

API 爬虫 练习 本地爬虫和网络爬虫 (1)本地爬虫 有如下文本&#xff0c;请按照要求爬取数据。 ​ Java自从95年问世以来&#xff0c;经历了很多版本&#xff0c;目前企业中用的最多的是Java8和Java11&#xff0c;因为这两个是长期支持版本&#xff0c;下一个长期支持版本时…

工作中常见问题总结

工作中常见错误清单 1、springboot实现无数据库启动 问题 springboot往往是作为b/s系统的server端的架子来使用&#xff0c;但是有些时候&#xff0c;是作为静默的server&#xff0c;并没有界面和数据库&#xff0c;但是springboot默认是链接数据库的&#xff0c;如何解决这个…

2024年初中生古诗文大会备考:选择题往年真题练习和解析

今天我们继续来做初中古诗文大会的选择题真题&#xff0c;让大家了解初中生古诗文大会的考察内容&#xff0c;并且提供了我独家的题目解析和答案&#xff0c;供孩子们参考。 Tips&#xff1a;通过对古诗文大会题目的解析发现&#xff0c;古诗文大会的许多题目都来自于中考、高…

Druid无法登录监控页面

问题表现&#xff1a;在配置和依赖都正确的情况下&#xff0c;无法通过配置的用户名密码登录Druid的监控页面 检查配置发现 配置的用户名和密码和请求中参数是一致的&#x1f914; Debug发现 ResourceServlet 是Druid的登录实现&#xff0c; 且调试发现usernameParam是null&am…

在jar里限制指定的包名才可调用(白名单)。

1. 在jar包中定义一个接口&#xff0c;例如 用于检查传入的hash值是否匹配预设的值。 2. 在调用接口的地方&#xff0c;获取当前应用的hash值。 3. 将当前应用的hash值与预设的值进行比较&#xff0c;如果匹配&#xff0c;则允许调用接口&#xff1b;否则&#xff0c;拒绝调用。…

Apache Maven简介

Maven 简介 Apache Maven 是一个用于项目构建、依赖管理和项目信息管理的强大工具。它基于项目对象模型(Project Object Model,POM)进行构建,通过描述项目的结构和依赖关系来管理项目的构建过程。 以下是 Apache Maven 的一些关键原理和工作流程: 项目对象模型(POM)…

网络 - OkHttp

一、概念 二、基本使用 2.1 get请求 fun getCall() {//创建客户端val client OkHttpClient.Builder().connectTimeout(5000, TimeUnit.MILLISECONDS).build()//创建请求val request Request.Builder().get().url("https://www.baidu.com").build()//创建任务val…

python程序设计基础:字符串与正则表达式

第四章&#xff1a;字符串与正则表达式 4.1字符串 最早的字符串编码是美国标准信息交换码ASCII&#xff0c;仅对10个数字、26个大写英文字母、26个小写英文字母及一些其他符号进行了编码。ASCII码采用1个字节来对字符进行编码&#xff0c;最多只能表示256个符号。 随着信息技…

【数据结构与算法初学者指南】【冲击蓝桥篇】String与StringBuilder的区别和用法

&#x1f389;&#x1f389;欢迎光临&#x1f389;&#x1f389; &#x1f3c5;我是苏泽&#xff0c;一位对技术充满热情的探索者和分享者。&#x1f680;&#x1f680; &#x1f31f;特别推荐给大家我的最新专栏《数据结构与算法&#xff1a;初学者入门指南》&#x1f4d8;&am…

docker打包当前dinky项目

以下是我的打包过程&#xff0c;大家可以借鉴。我也是第一次慢慢摸索&#xff0c;打包一个公共项目&#xff0c;自己上传。 如果嫌麻烦&#xff0c;可以直接使用我的镜像&#xff0c;直接跳到拉取镜像&#xff01; <可以在任何地方的服务器进行拉取> docker打包当前din…

LLMs之Gemma:Gemma(Google开发的新一代领先的开源模型)的简介、安装、使用方法之详细攻略

LLMs之Gemma&#xff1a;Gemma(Google开发的新一代领先的开源模型)的简介、安装、使用方法之详细攻略 导读&#xff1a;此文章介绍了Google推出的新一代开源模型Gemma&#xff0c;旨在帮助研发人员负责任地开发AI。 背景&#xff1a; >> Google长期致力于为开发者和研究人…

如何在 非C盘 安装 WSL?

来源&#xff1a;https://superuser.com/questions/1572834/is-there-any-way-to-install-wsl-on-non-c-drive 首先打开 Powershell&#xff0c;输入如下命令 &#xff08;Set-Location 到你想放置 WSL2 的磁盘&#xff09; # Substitute the drive on which you # want WSL …