​LeetCode解法汇总146. LRU 缓存

news/2024/5/20 6:42:30/文章来源:https://blog.csdn.net/AA5279AA/article/details/133272276

 目录链接:

力扣编程题-解法汇总_分享+记录-CSDN博客

GitHub同步刷题项目:

https://github.com/September26/java-algorithms

原题链接:力扣(LeetCode)官网 - 全球极客挚爱的技术成长平台


描述:

请你设计并实现一个满足  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

提示:

  • 1 <= capacity <= 3000
  • 0 <= key <= 10000
  • 0 <= value <= 105
  • 最多调用 2 * 105 次 get 和 put

解题思路:

* 解题思路:

* 这题最难的其实就是处理双向链表的关系。

* 构建两个方法updateHead和updateTail,分别代表节点变动后处理头部节点和尾部节点。

* 处理头部节点时,分为两种情况,当前节点如果已经是头部节点,则不需要处理。否则,把current的前后节点相连接,然后把current放到头节点。

* 处理尾部节点时,分为3种情况,如果map中只有一个,则当前节点就是尾节点;如果map长度为2,则之前的header就是尾节点;如果current是尾节点,则断开其与前面节点的关系,设置其前面的节点为尾节点。

代码:

class LRUCache
{
public:class Node{public:int key;int val;Node *next;Node *pre;Node(int mkey = 0, int mvalue = 0) : key(mkey), val(mvalue), next(nullptr), pre(nullptr){};};int maxSize = 0;unordered_map<int, Node *> valueMap;Node *header = nullptr;Node *tail = nullptr;LRUCache(int capacity){maxSize = capacity;}int get(int key){if (valueMap.find(key) == valueMap.end()){return -1;}Node *current = valueMap[key];updateTail(current);updateHead(current);return valueMap[key]->val;}void put(int key, int value){if (valueMap.find(key) != valueMap.end()){Node *current = valueMap[key];current->val = value;updateTail(current);updateHead(current);return;}if (valueMap.size() == maxSize){removeNode();}addNode(key, value);}void addNode(int key, int value){Node *current = new Node(key, value);valueMap[key] = current;updateTail(current);updateHead(current);}/*** 把current设置为header*/void updateHead(Node *current){if (header == current){return;}// 链表中删除当前节点if (current->pre != nullptr){current->pre->next = current->next;}if (current->next != nullptr){current->next->pre = current->pre;}// 加入头节点current->next = header;current->pre = nullptr;if (header != nullptr){header->pre = current;}header = current;}void updateTail(Node *current){// 如果长度为1时if (valueMap.size() == 1){tail = current;return;}if (valueMap.size() == 2){tail->pre = current;tail = header;}else if (current == tail){if (tail->pre != nullptr){tail->pre->next = nullptr;}if (valueMap.size() > 1){tail = current->pre;}}}void removeNode(){valueMap.erase(tail->key);Node *tailPre = tail->pre;if (tailPre == nullptr){return;}tailPre->next = nullptr;tail->pre = nullptr;tail = tailPre;}
};

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

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

相关文章

Lua函数

--函数--无参无返回值 function F1()print("F1函数") end F1() print("*****************")--有参 function F2(a)print("F2函数"..a) end F2(2) --如果传入参数和函数数量不一致 --不会报错只是补空 F2(1,2) print("*****************&quo…

使用ElementUI结合Mock完成主页的搭建

目录 一、Mock ( 1 ) 讲述 ( 2 ) 作用 二、引用 三、主页搭建 学习后带来的收获 一、Mock ( 1 ) 讲述 Mock.js是一个用于前端开发中模拟数据的库。它可以帮助开发人员在前端开发过程中模拟接口返回的数据&#xff0c;从而实现前后端分离开发。Mock.js提供了一套简单易…

浅谈! 几种 SpringBoot/SpringCloud 开源项目

简介 SpringBoot 是一个非常流行的 Java 框架&#xff0c;它可以帮助开发者快速构建应用程序。他不仅继承了 Spring 框架原有的优秀特性&#xff0c;而且还通过简化配置来进一步简化了 Spring 应用的整个搭建和开发过程。 最近&#xff0c;小编蹲点各大开源网站、社区等&…

算法-贪心+优先级队列-IPO

算法-贪心优先级队列-IPO 1 题目概述 1.1 题目出处 https://leetcode.cn/problems/ipo/description/?envTypestudy-plan-v2&envIdtop-interview-150 1.2 题目描述 2 回溯法 2.1 思路 2.2 代码 class Solution {int result 0;public int findMaximizedCapital(int …

95 # express 二级路由的实现

上一节实现了兼容老的路由写法&#xff0c;这一节来实现二级路由 二级路由实现核心&#xff1a; 进入中间件后&#xff0c;让对应的路由系统去进行匹配操作中间件进去匹配需要删除 path&#xff0c;存起来出去时在加上 示意图&#xff1a; 代码实现如下&#xff1a; rout…

消息队列(RabbitMQ+RocketMQ+Kafka)

消息队列是一种应用程序之间通过异步通信进行数据交换的通信模式 消息队列的类型&#xff1a; 点对点&#xff0c;一对一的消息传递模型&#xff0c;其中每个消息只能被一个接收者消费。发送者将消息发送到队列中&#xff0c;而接收者从队列中获取消息并进行处理&#xff0c;…

前端项目练习(练习-005-webpack-03)

学习前&#xff0c;首先&#xff0c;创建一个web-005项目&#xff0c;内容和web-004一样。&#xff08;注意将package.json中的name改为web-005&#xff09; 前面的代码中&#xff0c;打包工作已经基本完成了&#xff0c;下面开始在本地启动项目。这里需要用到webpack-dev-serv…

Linux C/C++下收集指定域名的子域名信息(类似dnsmap实现)

我们知道dnsmap是一个工具&#xff0c;主要用于收集指定域名的子域名信息。它对于渗透测试人员在基础结构安全评估的信息收集和枚举阶段非常有用&#xff0c;可以帮助他们发现目标公司的IP网络地址段、域名等信息。 dnsmap的操作原理 dnsmap&#xff08;DNS Mapping&#xff…

Ubuntu安装openssh-server出现失败

最近想用ssh连接&#xff0c;但发现openssh-server安装不了&#xff0c;上网搜了一些资料最终解决问题&#xff0c;其实主要就是依赖冲突的问题导致安装不了。 先查看自己应该安装哪个版本 sudo apt-cache policy openssh-client openssh-server我已安装好&#xff0c;根据自己…

计算机竞赛 深度学习交通车辆流量分析 - 目标检测与跟踪 - python opencv

文章目录 0 前言1 课题背景2 实现效果3 DeepSORT车辆跟踪3.1 Deep SORT多目标跟踪算法3.2 算法流程 4 YOLOV5算法4.1 网络架构图4.2 输入端4.3 基准网络4.4 Neck网络4.5 Head输出层 5 最后 0 前言 &#x1f525; 优质竞赛项目系列&#xff0c;今天要分享的是 &#x1f6a9; *…

9月25日星期一,今日早报简报微语报早读

9月25日&#xff0c;星期一&#xff0c;早报简报微语早读分享。 1、祝贺中国队&#xff01;开幕首日中国队20金7银3铜&#xff0c;共计30枚奖牌&#xff0c;位列奖牌榜第一名&#xff1b; 2、NBL深蓝官宣&#xff1a;陕西罢赛遭重罚 罚款100万取消评奖资格&#xff1b; 3、中…

国内音视频开发的前景怎么样?

国内音视频开发的前景怎么样? 本人就是音视频开发&#xff0c;谈一下我的观点。 目前干我们这一行的年纪都比较大&#xff0c;我自己工作五年就是很年轻的了。年会上老板说除了音视频中心的大家都是比较年轻的。。。 有些也是过了35岁了&#xff0c;四十的都有。是不是觉得这…

Unity之Hololens开发如何实现UI交互

一.前言 什么是Hololens? Hololens是由微软开发的一款混合现实头戴式设备,它将虚拟内容与现实世界相结合,为用户提供了沉浸式的AR体验。Hololens通过内置的传感器和摄像头,能够感知用户的环境,并在用户的视野中显示虚拟对象。这使得用户可以与虚拟内容进行互动,将数字信…

培养现货黄金投资的盈利能力

在现货黄金市场中&#xff0c;如何定义投资能否成功&#xff0c;关键的就是看现货黄金投资者的盈利能力&#xff0c;简单来说&#xff0c;就是投资者在市场中能够赚多少钱&#xff0c;这是可以量化的指标。所以每一个现货黄金投资者都渴望提升自己的盈利能力&#xff0c;一方面…

华为云云耀云服务器 L 实例评测:快速建站的新选择,初创企业和开发者的理想之选

华为云云耀云服务器 L 实例测评&#xff1a;快速建站的新选择&#xff0c;初创企业和开发者的理想之选 文章目录 华为云云耀云服务器 L 实例测评&#xff1a;快速建站的新选择&#xff0c;初创企业和开发者的理想之选导语&#xff1a;摘要&#xff1a; 正文产品概述部署简易性 …

如何快速提高沃尔玛、亚马逊产品的权重和销量,自养号测评的重要性!

据沃尔玛最新财报显示&#xff0c;其第二季度营业收入达到1616亿美元&#xff0c;同比增长5.74%&#xff1b;第二季度净利润约为79亿美元&#xff0c;同比增长53%。其中&#xff0c;沃尔玛在美国电商业务销售额同比增长24%。 其用户忠诚度也很较高&#xff0c;沃尔玛每月独立访…

在微信公众平台 设置小程序域名白名单

首先 我们打开微信公众平台 微信公众平台 然后扫描二维码 登录自己需要操作的小程序 这里特别声明一下此操作必须是企业账号创建的小程序 然后 在左侧菜单中选择开发下的 开发管理 然后在这里选择 开发设置 然后 下拉找到 服务器域名 点击 修改 按钮 然后会需要你扫个二维…

K8SYaml文件详解及编写示例

文章目录 一.Yaml文件详解1.Yaml文件格式2.YAML 语法格式 二.Yaml文件编写及相关概念1.查看 api 资源版本标签2.yaml编写案例&#xff08;1&#xff09;相关标签介绍&#xff08;2&#xff09;Deployment类型编写nginx服务&#xff08;3&#xff09;k8s集群中的port介绍&#x…

Linux基本命令总结练习(过命令关)

1.新建网卡配置文件的软连接NIC1 [rootserver ~]# ln /etc/NetworkManager/system-connections/ens160.nmconnection NIC1 [rootserver ~]# stat /etc/NetworkManager/system-connections/ens160.nmconnection [rootserver ~]# stat NIC1 2.使用普通账户新建如下结构的2个目录&…

全栈工程师必须要掌握的前端JavaScript技能

作为一名全栈工程师&#xff0c;在日常的工作中&#xff0c;可能更侧重于后端开发&#xff0c;如&#xff1a;C#&#xff0c;Java&#xff0c;SQL &#xff0c;Python等&#xff0c;对前端的知识则不太精通。在一些比较完善的公司或者项目中&#xff0c;一般会搭配前端工程师&a…