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

LCR 031. LRU 缓存 - 力扣(LeetCode)

题解:

思路:

用一个哈希表和一个双端队列,队列里面存储key,哈希存value。get时把对应的key删除,放在队首。put时有旧的则删掉,size够了把队列的最后一个删掉。然后加入,并且覆盖哈希表里面的值。

代码:

class LRUCache {private int capacity;private Map<Integer,Integer> cache;private Deque<Integer> queue;public LRUCache(int capacity) {this.capacity=capacity;this.cache=new HashMap<>();this.queue=new LinkedList<>();}public int get(int key) {if(cache.containsKey(key)){queue.remove(key);queue.offerFirst(key);return cache.get(key);}return -1;}public void put(int y, int value) {if(cache.containsKey(y)){queue.remove(y);}if(queue.size()==capacity){Integer oldKey=queue.pollLast();cache.remove(oldKey);}cache.put(y,value);queue.offerFirst(y);}
}

class Node {int data;Node next;Node prev;Node(int data) {this.data = data;}
}class MyDeque {private Node front;private Node rear;private int size;public MyDeque() {front = null;rear = null;size = 0;}// 向队列前端添加元素public void offerFirst(int data) {Node newNode = new Node(data);if (isEmpty()) {front = newNode;rear = newNode;} else {newNode.next = front;front.prev = newNode;front = newNode;}size++;}// 移除指定元素public void remove(int key) {Node current = front;while (current != null) {if (current.data == key) {if (current == front) {pollFirst();} else if (current == rear) {pollLast();} else {current.prev.next = current.next;current.next.prev = current.prev;size--;}return;}current = current.next;}return;}// 从队列尾部移除元素public int pollLast() {if (isEmpty()) {return -1;}int removedData = rear.data;if (size == 1) {front = null;rear = null;} else {rear = rear.prev;rear.next = null;}size--;return removedData;}// 从队列前端移除元素public int pollFirst() {if (isEmpty()) {return -1;}int removedData = front.data;if (size == 1) {front = null;rear = null;} else {front = front.next;front.prev = null;}size--;return removedData;}// 判断队列是否为空public boolean isEmpty() {return size == 0;}// 获取队列大小public int size() {return size;}}

完整的双端队列:

class Node {int data;Node next;Node prev;Node(int data) {this.data = data;}
}public class MyDeque {private Node front;private Node rear;private int size;public MyDeque() {front = null;rear = null;size = 0;}// 向队列前端添加元素public void addFirst(int data) {Node newNode = new Node(data);if (isEmpty()) {front = newNode;rear = newNode;} else {newNode.next = front;front.prev = newNode;front = newNode;}size++;}// 向队列尾部添加元素public void addLast(int data) {Node newNode = new Node(data);if (isEmpty()) {front = newNode;rear = newNode;} else {rear.next = newNode;newNode.prev = rear;rear = newNode;}size++;}// 从队列前端移除元素public int removeFirst() {if (isEmpty()) {throw new IllegalStateException("队列为空");}int removedData = front.data;if (size == 1) {front = null;rear = null;} else {front = front.next;front.prev = null;}size--;return removedData;}// 从队列尾部移除元素public int removeLast() {if (isEmpty()) {throw new IllegalStateException("队列为空");}int removedData = rear.data;if (size == 1) {front = null;rear = null;} else {rear = rear.prev;rear.next = null;}size--;return removedData;}// 移除指定元素public void remove(int key) {Node current = front;while (current != null) {if (current.data == key) {if (current == front) {removeFirst();} else if (current == rear) {removeLast();} else {current.prev.next = current.next;current.next.prev = current.prev;size--;}return;}current = current.next;}throw new IllegalArgumentException("队列中没有该元素");}// 获取队列前端元素public int getFirst() {if (isEmpty()) {throw new IllegalStateException("队列为空");}return front.data;}// 获取队列尾部元素public int getLast() {if (isEmpty()) {throw new IllegalStateException("队列为空");}return rear.data;}// 判断队列是否为空public boolean isEmpty() {return size == 0;}// 获取队列大小public int size() {return size;}}

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

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

相关文章

Pytorch 学习路程

目录 下载Pytorch 入门尝试 几种常见的Tensor Scalar Vector Matrix AutoGrad机制 线性回归尝试 使用hub模块 Pytorch是重要的人工智能深度学习框架。既然已经点进来&#xff0c;我们就详细的介绍一下啥是Pytorch PyTorch 希望将其代替 Numpy 来利用 GPUs 的威力&…

缓存击穿的解释

缓存击穿就是一个缓存key过期了&#xff0c;但是这个时候有大量请求请求这个key的数据&#xff0c;然后直接越过redis直接访问数据库&#xff0c;这样的话&#xff0c;数据库扛不住这么大的访问量直接崩了 解决方案&#xff1a; 设置热点数据永不过期&#xff0c;热点数据就是…

Python --- 在python中安装NumPy,SciPy,Matplotlib以及scikit-learn(Windows平台)

在python中安装NumPy&#xff0c;SciPy&#xff0c;Matplotlib以及scikit-learn(Windows平台) 本文是针对(像我一样的)python新用户所写的&#xff0c;刚刚在电脑上装好python之后&#xff0c;所需的一些常见/常用的python第三方库/软件包的快速安装指引。包括了这些常用安装包…

(mac)性能监控平台搭建JMeter+Grafana+Influxdb

【实现原理】 通过influxdb数据库存储jmeter的结果&#xff0c;再通过grafana采集influxdb数据库数据&#xff0c;完成监控平台展示 一、时间序列数据InfluxDB 1.InfluxDB下载安装 官网下载 https://portal.influxdata.com/downloads/ 官网最新版&#xff1a; &#xff0…

测试用例的编写评审

1、什么叫软件测试用例 什么是测试用例 测试用例(TestCase) 是为项目需求而编制的一组测试输入、执行条件 以及预期结果&#xff0c;以便测试某个程序是否满足客户需求。–测试依据 可以总结为:每一个测试点的数据设计和步骤设计。–测试用例 2、测试用例的重要性(了解) 2.1…

x-cmd mod | x whisper - 使用 whisper.cpp 进行本地 AI 语音识别

介绍 Whisper 模块通过 whisper.cpp 帮助用户快速将音频转换为文字。 INFO: whisper.cpp 是一个用 C/C 编写的轻量级智能语音识别库&#xff0c;是基于 OpenAI 的 Whisper 模型的移植版本&#xff0c;旨在通过深度学习模型实现音频转文字功能。 由于 whisper.cpp 目前只支持 1…

记录一下flume中因为taildir_position.json因位置不对导致数据无法从kafka被采到hdfs上的问题

【背景说明】 我需要用flume将kafka上的数据采集到hdfs上&#xff0c;发现数据怎么到不了hdfs。 【问题排查】 1.kafka上已有相应的数据 2.我的flume配置文档&#xff08;没问题&#xff09;&#xff0c; 3.时间拦截器&#xff08;没问题&#xff09;&#xff0c; 4.JSONObje…

《运营之光》3.0 读书笔记

&#x1f604;作者简介&#xff1a; 小曾同学.com,一个致力于测试开发的博主⛽️&#xff0c;主要职责&#xff1a;测试开发、CI/CD 如果文章知识点有错误的地方&#xff0c;还请大家指正&#xff0c;让我们一起学习&#xff0c;一起进步。 &#x1f60a; 座右铭&#xff1a;不…

HarmonyOS开发案例:【首选项】

介绍 本篇Codelab是基于HarmonyOS的首选项能力实现的一个简单示例。实现如下功能&#xff1a; 创建首选项数据文件。将用户输入的水果名称和数量&#xff0c;写入到首选项数据库。读取首选项数据库中的数据。删除首选项数据文件。 最终效果图如下&#xff1a; 相关概念 [首…

OpenHarmony鸿蒙南向开发案例:【智能门铃】

样例简介 智能门铃通过监控来访者信息&#xff0c;告诉主人门外是否有人按铃、有陌生人靠近或者无人状态。主人可以在数字管家中远程接收消息&#xff0c;并根据需要进行远程取消报警和一键开锁。同时&#xff0c;也可以通过室内屏幕获取门外状态。室内屏幕显示界面使用DevEco…

SQL增加主键约束的条件

结论 常见认为设为主键的条件为&#xff1a; 值唯一不含空值 具体实施中会出现各种问题 添加主键约束的条件细则&#xff1a; 值唯一数据中不含空值在定义时需要not null约束&#xff08;使用check约束不行&#xff09; 验证实验 接下来我做了关于这个细则的验证实验&am…

将一个文件夹的pdf都去掉第一页后生成在另一个文件夹

目录 一.前言 二.环境配置 三.完整代码 一.前言 在日常的工作和学习中&#xff0c;我们经常需要处理大量的PDF文件。有时候&#xff0c;我们可能希望将一个文件夹中的所有PDF文件进行一些特定的操作&#xff0c;例如去掉每个PDF文件的第一页。 为了解决这个问题&#xff0c…

【MATLAB源码-第193期】基于matlab的网络覆盖率NOA优化算法仿真对比VFINOA,VFPSO,VFNGO,VFWOA等算法。

操作环境&#xff1a; MATLAB 2022a 1、算法描述 NOA&#xff08;Network Optimization Algorithm&#xff0c;网络优化算法&#xff09;是一个针对网络覆盖率优化的算法&#xff0c;它主要通过优化网络中节点的分布和配置来提高网络的整体覆盖性能。网络覆盖率是衡量一个无…

【学习】软件压力测试对软件产品的作用

在信息化高速发展的今天&#xff0c;软件产品已经成为各行各业不可或缺的一部分。然而&#xff0c;随着软件功能的日益复杂和用户需求的不断增长&#xff0c;软件产品的稳定性和可靠性问题也愈发凸显。在这样的背景下&#xff0c;软件压力测试作为软件质量保障的重要手段之一&a…

【项目亮点】大厂中分布式事务的最佳实践 问题产生->难点与权衡(偏爱Saga)->解决方案

【项目亮点】大厂中分布式事务的最佳实践 问题产生->难点与权衡->解决方案->底层实现->应用案例 不断有同学问我大厂中实践分布式事务的问题,这里从分布式事务的产生,到强弱一致性与性能的权衡,再到最终落地的解决方案,再到实际的代码实现,再到我工作中实际使用SA…

【C语言__动态内存管理__复习篇6】

目录 前言 一、动态内存管理 二、动态内存函数 2.1 malloc 2.2 free 2.3 calloc 2.4 realloc 三、动态内存常见的6个使用错误 3.1 接收malloc/calloc返回的参数后未及时检查是否为NULL 3.2 越界访问动态内存空间 3.3 对非动态开辟的内存使用free释放 3.4 使用free只释放了…

AI时代,我要如何学习,才能跟上步伐

在21世纪这个被数据驱动的时代&#xff0c;人工智能&#xff08;AI&#xff09;已经渗透到我们生活的方方面面。无论是智能手机中的语音助手、在线客服的聊天机器人&#xff0c;还是自动驾驶汽车&#xff0c;AI的应用都在告诉我们一个信息&#xff1a;未来已来。因此&#xff0…

1.微服务介绍

完整的微服务架构图 注册中心 配置中心 服务集群 服务网关 分布式缓存 分布式搜索 数据库集群 消息队列 分布式日志服务 系统监控链路追踪 Jenkins docker k8s 技术栈 微服务治理&#xff1a; 注册发现、远程调用、负载均衡、配置管理、网关路由、系统保护、流量…

微信小程序 input 不能输入特殊字符的方法

微信小程序开发中经常遇到有表单提交的需求&#xff0c;一些特殊的字段要过滤掉特殊字符。比如姓名、籍贯、地址等&#xff0c;都要实现不能输入特殊字符的功能&#xff0c;可以创建一个统一的方法来处理输入事件&#xff0c;并在这个方法中检查输入的字符。 下面是一个简单的…

企业单位IPTV数字电视直播与点播系统-中国卫通怀来地球站IPTV数字电视直播与点播系统应用浅析

企业单位IPTV数字电视直播与点播系统-中国卫通怀来地球站IPTV数字电视直播与点播系统应用浅析 由北京海特伟业科技有限公司任洪卓发布于2024年4月19日 一、运营商光猫接入企业/单位IPTV数字电视直播与点播系统建设概述 中国卫通怀来地球站&#xff0c;位于怀来县土木镇&#xf…