当前位置: 首页 > news >正文

2023-09-24 LeetCode每日一题(LRU 缓存)

2023-09-24每日一题

一、题目编号

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) 的平均时间复杂度运行。

四、解题代码

struct DLinkedNode {int key, value;DLinkedNode* prev;DLinkedNode* next;DLinkedNode(): key(0), value(0), prev(nullptr), next(nullptr) {}DLinkedNode(int _key, int _value): key(_key), value(_value), prev(nullptr), next(nullptr) {}
};class LRUCache {
private:unordered_map<int, DLinkedNode*> cache;DLinkedNode* head;DLinkedNode* tail;int size;int capacity;public:LRUCache(int _capacity): capacity(_capacity), size(0) {// 使用伪头部和伪尾部节点head = new DLinkedNode();tail = new DLinkedNode();head->next = tail;tail->prev = head;}int get(int key) {if (!cache.count(key)) {return -1;}// 如果 key 存在,先通过哈希表定位,再移到头部DLinkedNode* node = cache[key];moveToHead(node);return node->value;}void put(int key, int value) {if (!cache.count(key)) {// 如果 key 不存在,创建一个新的节点DLinkedNode* node = new DLinkedNode(key, value);// 添加进哈希表cache[key] = node;// 添加至双向链表的头部addToHead(node);++size;if (size > capacity) {// 如果超出容量,删除双向链表的尾部节点DLinkedNode* removed = removeTail();// 删除哈希表中对应的项cache.erase(removed->key);// 防止内存泄漏delete removed;--size;}}else {// 如果 key 存在,先通过哈希表定位,再修改 value,并移到头部DLinkedNode* node = cache[key];node->value = value;moveToHead(node);}}void addToHead(DLinkedNode* node) {node->prev = head;node->next = head->next;head->next->prev = node;head->next = node;}void removeNode(DLinkedNode* node) {node->prev->next = node->next;node->next->prev = node->prev;}void moveToHead(DLinkedNode* node) {removeNode(node);addToHead(node);}DLinkedNode* removeTail() {DLinkedNode* node = tail->prev;removeNode(node);return node;}
};

五、解题思路

(1) 双端链表。

http://www.lryc.cn/news/174573.html

相关文章:

  • 《计算机视觉中的多视图几何》笔记(10)
  • 【一、虚拟机vmware安装】
  • uniapp 离线打包 plus.runtime.install 安装页面不弹起
  • Docker 自动化部署(保姆级教程)
  • 北工大汇编题——分支程序设计
  • 贴片电容耐压值选取和特性(包含实际电路和PCB)
  • 【云原生】kubernetes中pod(进阶)
  • Cesium 问题:获取高度值,高度值又是相对于谁来说的
  • 第三、四、五场面试
  • 力扣-290.单词规律
  • 常见限流算法学习
  • JS面试相关
  • SSRF漏洞
  • Qt5开发及实例V2.0-第十八章-Qt-MyselfQQ实例
  • 当下IT测试技术员的求职困境
  • MR混合现实情景实训教学
  • 嵌入式C++总结
  • C语言之内存函数篇(3)
  • java面试题-学成在线项目
  • ViewBinding——Android之视图绑定
  • vue学习-04vue的props配置项和mixin混入
  • 九、多项式朴素贝叶斯算法(Multinomial NB,Multinomial Naive Bayes)(有监督学习)
  • 数据结构上机练习——单链表的基本操作、头文件、类定义、main函数、多种链表算法的实现,含注释
  • 如何通过AI视频智能分析技术,构建着装规范检测/工装穿戴检测系统?
  • C语言自定义类型(上)
  • Python - 小玩意 - 圣诞树背景音乐弹窗
  • The 2023 ICPC Asia Regionals Online Contest (1) E. Magical Pair(数论 欧拉函数)
  • <十三>objectARX开发:模拟实现CAD的移动Move命令
  • Autosar基础:模式管理-EcuM
  • 代码随想录Day42 | 01背包问题| 416. 分割等和子集