146.LRU缓存

devtools/2024/11/7 3:38:46/

题目:

请你设计并实现一个满足  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够了把队列的最后一个删掉。然后加入,并且覆盖哈希表里面的值。

代码:

java">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);}
}

java">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;}}

完整的双端队列:

java">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.ppmy.cn/devtools/15586.html

相关文章

python - ExcelWriter.book 无法设置属性 ‘book‘

问题描述 conda 环境使用python编辑excel&#xff0c;安装pandas依赖版本为2.2.1。 pandas2.2.1 以下代码片段报错&#xff1a; AttributeError: property book of OpenpyxlWriter object has no setter&#xff08;无法设置属性 book &#xff09; with pd.ExcelWriter(t…

C++ 之 string类 详细讲解

喜欢的人有点难追怎么办 那就直接拉黑 七个女生在一起是七仙女&#xff0c;那七个男生在一起是什么&#xff1f; 葫芦七兄弟 目录 一、为什么要学习string类 二、标准库中的string类 1.string类 2.string类的常用接口说明 2.1 string类对象的常见构造 2.2 string类对…

19-ESP32-S3外设IIC

ESP32-S3的IIC 引言 ESP32-S3是一款集成了Wi-Fi和蓝牙功能的低成本、多功能微控制器。在这篇博客中&#xff0c;我们将详细介绍ESP32-S3的IIC&#xff08;Inter-Integrated Circuit&#xff09;接口&#xff0c;也被称为I2C。 IIC简介 IIC是一种串行、同步、多设备、半双工…

桐乡上元——UI设计

上元教育&#xff0c;创办于2005年&#xff0c;15年一路走来&#xff0c;专注于更优质的课程&#xff0c;只为给学生更好地教学服务&#xff0c;UI设计精英班&#xff0c;历时多年&#xff0c;数次变革&#xff0c;只为塑造UI设计精英&#xff0c;成就学员优质薪资梦想&#xf…

artifactory配置docker本地存储库

​一、概述 本地 Docker 存储库是我们部署和托管内部 Docker 镜像的位置。实际上&#xff0c;它是一个 Docker 注册表&#xff0c;能够托管的 Docker 镜像的集合。通过本地存储库&#xff0c;你可以保存、加载、共享和管理自己的 Docker 镜像&#xff0c;而无需依赖于外部的镜像…

【机器学习】小波变换在特征提取中的实践与应用

小波变换在特征提取中的实践与应用 一、小波变换的基本原理与数学表达二、基于小波变换的特征提取方法与实例三、小波变换在特征提取中的优势与展望 在信号处理与数据分析领域&#xff0c;小波变换作为一种强大的数学工具&#xff0c;其多尺度分析特性使得它在特征提取中扮演着…

袁庭新ES系列16节|Elasticsearch客户端高级操作

前言 上一章节袁老师主要带领大家学习了Elasticsearch客户端基础部分的内容&#xff0c;Elasticsearch客户端还有很多高级相关的操作&#xff0c;这一章节主要带领大家来学习Elasticsearch客户端高级相关的操作。接下来就跟上袁老师的节奏继续探讨Elasticsearch的相关知识。 一…

uniapp自定义轮播图指示点样式实现完整代码附效果图

效果图&#xff1a; 实现代码&#xff1a; <view class"card card_b"><swiper :autoplay"true" interval"3000" duration"500" :current"swiperCurrent" change"swiperChange"class"swiper" :…