LeetCode热题100——146. LRU 缓存

https://leetcode.cn/problems/lru-cache/description/?envType=study-plan-v2&envId=top-100-liked

请你设计并实现一个满足 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) 的平均时间复杂度运行。

小米一面,没刷过题所以栽了,静下来心看看解决方案

题解

题目中涉及到了 查询、插入和删除都要平均时间复杂度O(1),查询想要时间复杂度O(1) 可以用数组,插入删除如果使用数组无法满足要求,因为从数组中删除元素涉及到元素的移动复杂度 O(n), 我们必须使用链表来插入和删除,链表分为单链表和双链表,如果使用单链表删除元素的话还是需要遍历才能找到前后的元素,所以我们使用 哈希表查询 + 双链表操作 的思路

在这里插入图片描述
通过设置head和tail虚节点,避免判空等处理,这样取第一个元素时直接调用 head.next ,取最后一个元素时直接调用 tail.pre

class LRUCache {class Node {int val;int key;Node next;Node pre;public Node(int key, int val) {this.key = key;this.val = val;}}private int mSize;private Map<Integer, Node> map;private Node head;private Node tail;public LRUCache(int size) {mSize = size;map = new HashMap<>();// 技巧处,使用头尾虚节点来处理 空异常head = new Node(-1, -1);tail = new Node(-1, -1);head.next = tail;tail.pre = head;}public int get(int key) {if (!map.containsKey(key)) return -1;Node node = map.get(key);removeNode(node);addToHead(node);return node.val;}public void put(int key, int val) {if (map.containsKey(key)) {removeNode(map.get(key));}Node node = new Node(key, val);map.put(key, node);addToHead(node);// 易错点,超过限制时需要同时移除 双链表 node和 map中的nodeif(map.size() > mSize){Node lastNode = tail.pre;removeNode(lastNode);map.remove(lastNode.key);}}private void addToHead(Node node) {Node first = head.next;head.next = node;node.next = first;first.pre = node;node.pre = head;}private void removeNode(Node node) {Node preNode = node.pre;Node nextNode = node.next;preNode.next = nextNode;nextNode.pre = preNode;}
}

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

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

相关文章

一个Pycharm窗口添加多个项目来满足运行多个项目的需求

需求&#xff1a;此前项目文件只有D:\pythonProject 现在进行了如下操作 同时显示两个文件夹D:\pythonProject D:\pythonProject-gh操作步骤如下&#xff1a;最终结果如图所示

mars3d实现省界线宽度>市界线宽度效果

效果图&#xff1a; 实现代码&#xff1a; export function showChinaLine() {map.basemap 2017graphicLayer new mars3d.layer.GeoJsonLayer({name: "全国省界",url: "https://data.mars3d.cn/file/geojson/areas/420000_full.json",format: simplifyG…

Stack、Queue and Deque

文章目录一、适配器二、stcak模拟实现三、queue模拟实现四、vector和list的优缺点五、deque六、deque的优缺点七、deque为什么作为stack和queue的默认适配容器一、适配器1.适配器的概念&#xff1a;封装一个已有对象&#xff0c;转换其接口2.容器适配器&#xff1a;封装一个已有…

[echart] Vue3中使用Echart时图表不渲染

onMounted(() > {nextTick(() > {chartInstance echarts.init(document.getElementById(chart));chartInstance.setOption(option);}); });参考&#xff1a; Vue3中使用Echart时如何解决图表不渲染或显示空白的问题&#xff1f;

关于windows虚拟机无法联网问题

看虚拟机相关的服务是否开启 win R &#xff1a;services.msc确保这几个服务都是可以的&#xff0c;没有被禁止 如果写的禁止&#xff0c;用下面的方法可以恢复服务在虚拟机里面打开虚拟网络编辑器。还原默认配置即可&#xff0c;虚拟机网络服务就开启了。但也有一些加密软件会…

将 YOLOv11 的 .pt 模型转换为 YOLOv8 格式需要特定的处理流程 机器学习 计算机视觉cv

将 YOLOv11 的 .pt 模型转换为 YOLOv8 格式需要特定的处理流程。以下是完整的转换指南&#xff1a; 转换原理 YOLOv11 和 YOLOv8 的核心差异在于&#xff1a; 模型结构&#xff1a;v11 使用 RepVGG 或 Swin Transformer 等新型骨干网络输出头&#xff1a;v11 可能使用解耦头或 …

BIFU币富探索合规新路径 助力用户玩转RWA

随着区块链技术的不断发展&#xff0c;其在实体资产领域的应用正受到关注。通过技术手段实现资产信息的透明化、可追溯化&#xff0c;成为提升资产管理效率的新方向。所谓真实世界资产&#xff08;RWA&#xff09;的数字化管理&#xff0c;核心在于依托区块链技术建立实体资产与…

05-netty基础-ByteBuf数据结构

1 基本概念在网络编程中&#xff0c;字节数据的处理是核心环节之一。无论是客户端与服务器之间的通信&#xff0c;还是数据的编解码操作&#xff0c;都离不开对字节缓冲区的高效管理。Java 原生的 ByteBuffer 虽然提供了基础功能&#xff0c;但在灵活性、性能和易用性上存在诸多…

【Nginx反向代理】通过Nginx反向代理将多个后端server统一到同一个端口上的方法

文章目录前言解决方案&#xff1a;使用 Nginx 做统一反向代理前言 在多人开发任务中&#xff0c;如果不同人负责不同的后端接口服务开发&#xff0c;那么就面临着每个人的服务部署到不同的端口上&#xff0c;甚至有的人的服务部署在不同的服务器上。这时候前端如果想要调用后端…

Chrontel【CH7219A-BF】CH7219A USB-C和DP 1.4至HDMI 2.1协议转换器,带DSC解码功能

G通用 D描述Chrontel 的 CH7219A 是一种低成本、低功耗的半导体器件 通过 USB Type-C 将 DisplayPort 信号转换为 HDMI 2.0 连接器。这款基于 USB Type-C 的创新型 DisplayPort 接收器具有高 高性能DSC解码器&#xff0c;集成HDMI 2.0发射器 专为 USB Type-C 转 HDMI 2.0 转换器…

疯狂星期四文案网第26天运营日记

网站运营第26天&#xff0c;点击观站&#xff1a; 疯狂星期四 crazy-thursday.com 全网最全的疯狂星期四文案网站 运营报告 今日访问量 30多ip,断崖式下跌&#xff0c;习惯了。。 今日搜索引擎收录情况 必应52个页面&#xff0c;比昨日12 百度仍然只有首页 谷歌收录正常 …

元策联盈:深耕金融领域,赋能行业发展​

元策联盈&#xff1a;深耕金融领域&#xff0c;赋能行业发展元策联盈在金融行业的深耕细作&#xff0c;不仅体现在为客户提供优质服务上&#xff0c;更在于其对行业发展的积极推动和自身的不断创新突破。行业贡献与社会责任元策联盈始终将社会责任融入企业发展的血脉之中。在助…

力扣-字母异位词

这里我也是没有太懂&#xff0c;只懂个大概&#xff0c;先统计p和当前窗口的字符&#xff0c;后主要在窗口大小固定为 p.length()&#xff0c;在 s 上滑动做文章&#xff0c;在s里找到p的长度大小&#xff0c;最后直接比较两个频率数组来判断异位词定长窗口做法class Solution …

华为数通HCIP

华为认证数通方向的 HCIP&#xff08;华为认证 ICT 高级工程师&#xff09;考试难度适中&#xff0c;既不像 HCIA&#xff08;初级&#xff09;那样侧重基础概念&#xff0c;也不像 HCIE&#xff08;专家级&#xff09;需要复杂的综合实验和面试&#xff0c;但仍需要系统的知识…

在SQL SERVER 中,用SSMS 实现存储过程的每日自动调用

在 SQL Server Management Studio (SSMS) 中实现每日自动调用存储过程&#xff0c;需通过 ​​SQL Server 代理作业​​配置定时任务。以下是详细操作步骤&#xff1a;&#x1f527; 一、启用 SQL Server 代理服务&#xff08;前置条件&#xff09;​​启动服务​​&#xff1a…

赛博算命之八字测算事业运势的Java实现(四柱、五行、十神、流年、格局详细测算)

个人主页-爱因斯晨 文章专栏-赛博算命 最近学习人工智能时遇到一个好用的网站分享给大家&#xff1a; 人工智能学习 文末有投票&#xff0c;评论区有红包哦&#xff01; 前言 在前段时间更新了赛博算命系列&#xff0c;出乎我的意料反响很好。也受到广大网友的赞赏&#xff0…

2025 腾讯广告算法大赛 Baseline 项目解析

项目概述 2025 腾讯广告算法大赛 Baseline&#xff0c;一个简单的序列推荐系统&#xff0c;主要用于建模用户和物品的交互序列&#xff0c;并利用多模态特征&#xff08;文本、图像等 embedding&#xff09;来提升推荐效果。 核心文件功能 1. main.py - 主训练脚本 负责模型训练…

数据结构(11)栈和队列算法题 OVA

一、概念与结构 循环队列是一种特殊的队列&#xff0c;首尾相连成环&#xff0c;也叫环形队列。环形队列具有以下三个特点&#xff1a; &#xff08;1&#xff09;队头删除数据&#xff0c;队尾插入数据。 &#xff08;2&#xff09;给定固定的空间&#xff0c;使用过程中不…

九联UNT403HS_海思MV320处理器_安卓9-优盘强刷刷机包

九联UNT403HS_海思MV320处理器_安卓9-优盘强刷刷机包前言&#xff1a;九联UNT403HS&#xff0c;海思MV320芯片&#xff0c;已知有2种内存型号&#xff0c;分别是28G和216G。已知河南融合版本是28G&#xff0c;广东版好像既有28G又有216G。理论上固件没有本质区分&#xff0c;能…

Xilinx高性能低延时PCIe-DMA控制器IP,SGDMA,QDMA,RDMA,CDMA,V4L2驱动,视频采集、AD采集

Multi-Channel High Performance PCIe QDMA&RDMA IP介绍基于PCI Express Integrated Block&#xff0c;Multi-Channel PCIe QDMA Subsystem实现了使用DMA地址队列的独立多通道、高性能Continous&#xff08;CDMA&#xff09;或Scather Gather DMA&#xff08;SGDMA&#xf…