力扣---***********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 ,则应该 逐出 最久未使用的关键字。

函数 getput 必须以 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

官方题解:

哈希表 + 双向链表

详见:

作者:力扣官方题解
链接:https://leetcode.cn/problems/lru-cache/solutions/259678/lruhuan-cun-ji-zhi-by-leetcode-solution/
来源:力扣(LeetCode)
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

代码:

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;}DLinkedNode * node = cache[key];moveToHead(node);return node->value;}void put(int key, int value) {if(!cache.count(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{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;}
};/*** 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/796350.shtml

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

相关文章

Flutter开发进阶之错误信息

Flutter开发进阶之错误信息 在Flutter开发中错误信息通常是由Exception和Error表示&#xff0c;Error表示严重且不可恢复的错误&#xff0c;一般会导致程序直接终止&#xff0c;而Exception可以被显式抛出&#xff0c;一般为代码逻辑错误&#xff0c;根据Flutter的解释说Excep…

Vue3:对ref、reactive的一个性能优化API

一、情景说明 我们知道&#xff0c;在Vue3中&#xff0c;想要创建响应式的变量&#xff0c;就要用到ref、reactive来包裹一下数据即可。 但是&#xff0c;这里有个损耗性能的地方 就是&#xff0c;被它包裹的数据&#xff0c;都会构建成响应式的&#xff0c;无论多少层次&…

【opencv】示例-aruco_dict_utils.cpp 计算 ArUco 字典度量

该程序可用于计算 ArUco 字典度量。 要计算考虑翻转标记的指标&#xff0c;请使用 -r 标志。 该程序可用于创建和编写自定义 ArUco 词典。 #include <opencv2/objdetect/aruco_detector.hpp> // 包含aruco marker检测相关功能的头文件 #include <iostream> // 包含…

数码视讯Q7盒子刷armbian遇到的坑之二

继续&#xff0c;nand的q7 搜遍全网&#xff0c;这个盒子能用的安卓映像有两个&#xff0c;一个本站付费下载的那个&#xff0c;另一个是20191218-Q7-nand-4.4.2-root-twrp-Milton这个映像&#xff08;具体地址自己搜索吧&#xff09;。第一个需要license&#xff0c;需要自己…

如何在 Ubuntu 上安装和配置 Tomcat 服务器?

简介&#xff1a;最近有粉丝朋友在问如何在 Ubuntu 上安装和配置 Tomcat 服务器&#xff1f;今天特地写这篇文章进行解答&#xff0c;希望能够帮助到大家。 文章目录 Ubuntu上安装和配置Tomcat的详细步骤Tomcat在Linux环境下的安装与配置一、下载并上传Tomcat压缩包二、启动To…

云架构(三) 防腐层模式

Anti-corruption Layer pattern (https://learn.microsoft.com/en-us/azure/architecture/patterns/anti-corruption-layer) 简单描述 实现一个门面或者适配层在新应用和历史遗留程序之间。在不同的系统之间实现一个门面或者适配层&#xff0c;不需要使用相同的语义。它在不…

961: 进制转换问

【学习版】 【C语言】 #include<iostream>struct SeqList {int top;int len;int* s; };void initStack(SeqList* stack, int len) {stack->s new int[len];stack->top -1;stack->len len; }void push(SeqList* stack, int x) {stack->s[stack->top] …

YOLOv5实战记录05 Pyside6可视化界面

个人打卡&#xff0c;慎看。 指路大佬&#xff1a;【手把手带你实战YOLOv5-入门篇】YOLOv5 Pyside6可视化界面_哔哩哔哩_bilibili 零、虚拟环境迁移路径后pip报错解决 yolov5-master文件夹我换位置后&#xff0c;无法pip install了。解决如下&#xff1a; activate.bat中修改…

.NET8 和 Vue.js 的前后端分离

在.NET 8中实现前后端分离主要涉及到两个部分&#xff1a;后端API的开发和前端应用的开发。后端API通常使用ASP.NET Core来构建&#xff0c;而前端应用则可以使用任何前端框架或技术栈&#xff0c;比如Vue.js、React或Angular等。下面是一个简化的步骤指南&#xff0c;帮助你在…

汇川PLC学习Day4:电机参数和气缸控制参数

汇川PLC学习Day4&#xff1a;伺服电机参数和气缸控制参数 一、伺服电机参数二、气缸参数1. 输入IO映射&#xff08;1&#xff09;输入IO映射&#xff08;2&#xff09; 输入IO触摸屏标签显示映射 2. 输出IO映射&#xff08;1&#xff09;输出IO映射&#xff08;2&#xff09; …

【工具或平台】Gem5编译

Gem5编译 安装依赖 源更新 sudo apt-get update sudo apt-get upgrade 安装依赖 sudo apt install vim sudo apt install build-essential git m4 scons zlib1g zlib1g-dev libprotobuf-dev protobuf-compiler libprotoc-dev libgoogle-perftools-dev python3-dev python-is-…

基于单片机电动车电压电流监测系统

**单片机设计介绍&#xff0c;基于单片机电动车电压电流监测系统 文章目录 一 概要二、功能设计设计思路 三、 软件设计原理图 五、 程序六、 文章目录 一 概要 基于单片机的电动车电压电流监测系统是一个集成了电子技术、单片机编程以及电压电流测量技术的系统。其主要目的是…

Open3D (C++) 从.txt文件中读取数据到矩阵

目录 一、算法概述二、代码实现三、结果展示四、测试数据本文由CSDN点云侠原创,原文链接。如果你不是在点云侠的博客中看到该文章,那么此处便是不要脸的爬虫与GPT。 一、算法概述 在进行实验的时候有时需要借助不同的工具来实现一些比较复杂的操作,比如使用matlab中自带的拉…

lua学习笔记4(运算符的学习)

print("*****************************lua运算符的学习*******************************") print("*****************************基本运算符*******************************") a1145 b8848 print("加法运算"..ab) print("减法运算".…

Spark-Scala语言实战(14)

在之前的文章中&#xff0c;我们学习了如何在spark中使用键值对中的fullOuterJoin&#xff0c;zip&#xff0c;combineByKey三种方法。想了解的朋友可以查看这篇文章。同时&#xff0c;希望我的文章能帮助到你&#xff0c;如果觉得我的文章写的不错&#xff0c;请留下你宝贵的点…

考研高数(平面图形的面积,旋转体的体积)

1.平面图形的面积 纠正&#xff1a;参数方程求面积 2.旋转体的体积&#xff08;做题时&#xff0c;若以x为自变量不好计算&#xff0c;可以求反函数&#xff0c;y为自变量进行计算&#xff09;

【STL学习】(3)vector容器

前言 本章主要内容为两个部分&#xff1a; vector是什么&#xff1f;vector常用接口的使用。 一、vector的介绍 vector是表示可变大小数组的容器就像数组一样&#xff0c;vector也采用的连续空间来存储元素。也意味着可以采用下标对vector的元素进行访问&#xff0c;和数组一样…

【二分查找】Leetcode 在排序数组中查找元素的第一个和最后一个位置

题目解析 34. 在排序数组中查找元素的第一个和最后一个位置 我们使用暴力方法进行算法演化&#xff0c;寻找一个数字的区间&#xff0c;我们可以顺序查找&#xff0c;记录最终结果 首先数组是有序的&#xff0c;所以使用二分法很好上手&#xff0c;但是我们就仅仅使用上一道题…

【数据仓库】血缘关系分析工具适用场景、常见产品、功能介绍

血缘关系分析工具是用于跟踪数据在系统中的流动和转换过程&#xff0c;帮助用户理解数据的来源、去向以及数据之间的关系。以下是关于血缘关系分析工具的详细介绍&#xff1a; 适用场景&#xff1a; 数据治理和合规性&#xff1a; 帮助组织跟踪敏感数据的流动&#xff0c;确保…

命名空间.cpp

目录 前序 什么是命名空间 为什么要使用命名空间 命名函数的定义 默认访问变量的顺序 命名空间的几种情况 不同命名空间中出现相同的命名 多个命名相同的命名空间 命名空间嵌套 命名空间的展开 展开命名空间的缺点 前序 相信大家在cpp代码中经常可以看到头文件下面…