LeetCode--代码详解 146.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 <= capacity <= 3000
  • 0 <= key <= 10000
  • 0 <= value <= 105
  • 最多调用 2 * 105 次 get 和 put

思路

哈希表+双向链表

本题可以使用java中封装好的LinkedHashMap

这里用手写链表的形式

map的key存储key,value存储链表节点

代码

class LRUCache {class LinkedNode{LinkedNode prev,next;int key,value;public LinkedNode(int key, int value){this.key = key;this.value = value;}}HashMap<Integer,LinkedNode> map;LinkedNode head,tail; //头尾指针int size,capacity; //当前容量、总容量//构造函数,初始化public LRUCache(int capacity) {map = new HashMap<>();this.capacity=capacity;head = new LinkedNode(-1,-1);tail = new LinkedNode(-1,-1);head.next = tail;tail.prev = head;size = 0;}public int get(int key) {if(map.containsKey(key)){LinkedNode node = map.get(key);if(tail.prev != node){deleteNode(node);addNodeToLast(node);}return node.value;}return -1;}public void put(int key, int value) {if(map.containsKey(key)){LinkedNode node = map.get(key);node.value=value;deleteNode(node);}else{if(size < capacity){ //还有容量,直接添加size++;}else{map.remove(head.next.key);deleteNode(head.next);}}LinkedNode newNode = new LinkedNode(key,value);addNodeToLast(newNode);map.put(key,newNode);}//删除private void deleteNode(LinkedNode node){node.prev.next=node.next;node.next.prev=node.prev;}//添加到最后一个private void addNodeToLast(LinkedNode node){node.prev = tail.prev;node.prev.next=node;node.next = tail;tail.prev=node;}
}/*** 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);*/

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

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

相关文章

【DevOps云实践】不同Azure Function的类型

【DevOps云实践】不同Azure Function的类型 Azure函数是由Microsoft Azure提供的无服务器计算服务,允许开发人员构建和部署应用程序而不必担心底层基础设施。使用Azure函数,您可以根据不同的触发器执行代码,并支持多种类型的函数以满足不同的用例。在本博客文章中,我们将探…

springboot + jpa + 达梦数据库兼容 Mysql的GenerationType.IDENTITY主键生成策略

导入达梦数据库对hibernate的方言包 <dependency><groupId>com.dameng</groupId><artifactId>DmDialect-for-hibernate5.6</artifactId><version>8.1.2.192</version></dependency>配置文件中添加方言配置和主键生成策略配置…

VBA自适应多种排班计划日期填充

实例需求&#xff1a;某公司有两种不同排班计划 MWF: 周一周三周五-周一周三周五…TTS: 周二周四周六-周二周四周六… 但是数据表中有时会缺少部分日期&#xff0c;为了便于汇总多个部分的数据&#xff0c;现在需要将日期补全&#xff0c;对于补充的日期标记为黄色。 先讨论一…

【Python_Zebra斑马打印机编程学习笔记(六)】基于Fnthex32.dll将文字转换为打印机指令

基于Fnthex32.dll将文字转换为打印机指令 基于Fnthex32.dll将文字转换为打印机指令前言一、Fnthex32.dll二、python 加载 Fnthex32.dll 的方法1、使用 ctypes 加载 dll2、定义 GETFONTHEX 函数的参数类型和返回类型3、准备输入参数4、分配字符缓冲区来接收输出数据5、调用 dll …

Kafka整理-数据的持久性和可靠性

Apache Kafka保证数据的持久性和可靠性主要通过以下几个机制: 1、日志存储: Kafka将所有消息持久化到磁盘。这意味着即使发生系统故障,消息数据也不会丢失。每个消息在被认为已经“提交”(Committed)之前都会被写入磁盘。2、分区复制(Replication): Kafka中的每个分区都…

php-webdriver 通过队列的方式实现工作流

最近需要批量操作某个古老的后台&#xff0c;但是流程非常复杂&#xff0c;通过 php-webdriver/webdriver 写了个基于队列的方式实现工作流&#xff1b; 可以帮你实现web ui 测试&#xff0c; 自动登录站点&#xff0c;自动识别验证码&#xff08;不复杂的那种&#xff09;&am…

第一个 Angular 项目 - 添加路由

第一个 Angular 项目 - 添加路由 前置项目是 第一个 Angular 项目 - 添加服务&#xff0c;之前的切换页面使用的是 ngIf 对渲染的组件进行判断&#xff0c;从而完成渲染。这一步的打算是添加路由&#xff0c;同时添加 edit recipe 的功能(同样通过路由实现) 用到的内容为&…

解决物理机装不上VMnet1和VMnet8的虚拟网卡问题

问题描述&#xff1a; 博主在使用虚拟机时&#xff0c;发现物理机的ping命令连接不上虚拟机&#xff0c;导致xshell软件也连接不上&#xff0c;最后发现问题是更改适配器设置中没有虚拟机的网卡&#xff08;VMnet1和VMnet8&#xff09;&#xff1a; 方法一&#xff1a; 博主搜…

【MySQL】深入解析日志系统:undo log、redo log、bin log

文章目录 前言1、undo log1.1、undo log 是什么1.2、事务回滚 2、redo log2.1、redo log 是什么2.2、redo log 刷盘2.3、redo log 硬盘文件 3、bin log3.1、bin log 是什么3.2、bin log 和 redo log 区别3.3、bin log 刷盘3.4、两阶段提交 前言 MySQL数据库提供了功能强大的日…

LeetCode 1976.到达目的地的方案数:单源最短路的Dijkstra算法

【LetMeFly】1976.到达目的地的方案数&#xff1a;单源最短路的Dijkstra算法 力扣题目链接&#xff1a;https://leetcode.cn/problems/number-of-ways-to-arrive-at-destination/ 你在一个城市里&#xff0c;城市由 n 个路口组成&#xff0c;路口编号为 0 到 n - 1 &#xff…

使用vite创建一个vue3项目

创建一个vue3项目 1.使用命令npm create vuelatest来创建一个vue3项目&#xff0c;注意&#xff1a;官网说明了必须node版本是18及以上的&#xff0c;这边需要注意下 2.然后根据提示进入项目目录 先npm install安装依赖&#xff0c;然后npm run dev启动项目 大家可以看到&am…

Windows安装Go语言及VScode配置

最近搞自己的网站时突然想起来很多上学时的事&#xff0c;那会美国总统还是奥巴马&#xff0c;网页课教的是DreamWeaver跟Photoshop&#xff0c;其他语言像PHP、Java8、Python都有学一点&#xff0c;讲究一个所见即所得。虽然是信管专业那时和斌桑班长对新语言很感兴趣&#xf…

分享一个完全免费的GPT4站点,gpts也可以用

给大家分享一个完全免费的GPT4站点&#xff0c;gpts也可以用点击链接可用

init 5 相比 3 -- 增加的进程

init 5 (135)相比 3(66) -- 增加的进程(红色) root 1 0 0 Mar03 ? 00:00:13 /sbin/init auto noprompt root /lib/systemd/systemd-journald root vmware-vmblock-fuse /run/vmblock-fuse -o rw,subtype=vmware-vmblock,default_p…

【Leetcode】1588.所有奇数长度子数组的和

题目描述 思路 题目要求我们求解所有奇数长度数组的和。若暴力循环求解&#xff0c;时间复杂度过高。所以&#xff0c;我们可以采用前缀和优化。 如上图输入arr数组&#xff0c;sum[i]用于计算arr数组中前i个数的和。(在程序中&#xff0c;先给sum[0]赋值&#xff0c;等于arr[0…

小程序API能力集成指南——画布API汇总(三)

CanvasContext canvas 组件的绘图上下文。 方法如下&#xff08;2&#xff09;&#xff1a; arc CanvasContext.arc CanvasContext.arc(number x, number y, number r, number sAngle, number eAngle, boolean counterclockwise) 功能描述 创建一条弧线。 创建一个圆可…

android开发者工具,最新整理

一 Java相关 1.重载函数的签名(区别是否是重载函数) 答&#xff1a;方法名参数类型参数顺序(返回值不是) 2.finalize的工作原理 答&#xff1a;一旦垃圾收集器准备好释放对象占用的存储空间&#xff0c;它首先调用finalize()&#xff0c;而且只有在下一次垃圾收集过程中&#…

AlibabaCloud微服务:Linux 部署 Sentinel 流量控制

目录 一、实验 1.环境 2.Linux 部署 Sentinel 3. 微服务接入Sentinel配置 二、 问题 1.Linux本地启动Sentinel控制台 2.JDBC连接失败 一、实验 1.环境 &#xff08;1&#xff09;主机 表1 主机 系统软件版本IP备注Linuxopenjdk 1.8.0192.168.204.200 maven3.5.0nac…

构建强大的Spring Boot多租户系统

在当今互联网时代&#xff0c;许多企业都在寻求更灵活和可扩展的解决方案来满足不断增长的业务需求。Spring Boot多租户系统为企业提供了一种有效的方式&#xff0c;以实现更好的资源利用率和业务逻辑的隔离。本文将深入讨论Spring Boot多租户系统的关键方面&#xff0c;包括租…

服务器硬件基础知识

服务器硬件是指构成服务器的各种硬件组件&#xff0c;包括主板、处理器、内存、硬盘、电源等。这些硬件组件相互协作&#xff0c;为服务器提供计算和存储能力&#xff0c;使其能够运行各种应用程序和服务。 主板&#xff08;Motherboard&#xff09; 主板是服务器的核心组件&am…