leetcode 146.LRU 缓存

news2024/11/20 15:37:37

题目链接:leetcode 146

1.题目

请你设计并实现一个满足 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) 的平均时间复杂度运行。

2.示例

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

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

3.分析

虽然这道题思路不难想,但是细节真的好多,我看着我的提交记录陷入了沉思,真的应该给hard难度啊。。。
题目要求我们使用数据结构将映射的key和value存储下来,同时要求:
1)有内存限制,不能无限添加
2)添加和查询都是O(1)的操作
3)添加和查询都会让这个key值的优先级变得最高
4)当内存都被使用,又需要插入操作时,就需要删除掉优先级最低的key值
那么根据上述的描述,我们应该分别使用map和一个链表类来进行存储,需要注意的点有:
1)删除和添加改变节点间关系的时候都需要特判节点是不是空指针
2)链表节点类记得声明public
3)put 和get都需要把查询和添加的key值移到链表的尾部

4.代码

class ListNode1{
    public:
        int K,V;
        ListNode1* next,*la;
        ListNode1(int key,int val){
            K=key;
            V=val;
            next=NULL;
            la=NULL;
        }
};
class LRUCache {
public:
    map<int,ListNode1*> map1;
    int num=0,num1=0;
    ListNode1* head,*last;
    LRUCache(int capacity) {
        num=capacity;
        head=new ListNode1(0,0);
        last=head;
    }
    void make_piar(ListNode1* x,ListNode1* y){
        x->next=y;
        if(y!=NULL) y->la=x;
    }
    int get(int key) {
        if(map1.count(key)){
            ListNode1* m=map1[key]->la,*n=map1[key]->next;
            if(map1[key]!=last){
                make_piar(m,n);
                make_piar(last,map1[key]);
            }
            last=map1[key];
            return map1[key]->V;
        }
        // return (head->next)->K;
        return -1;
    }
    void put(int key, int value) {
        if(map1.count(key)){
            map1[key]->V=value;
            ListNode1* m=map1[key]->la,*n=map1[key]->next;
            if(map1[key]!=last){
                make_piar(m,n);
                make_piar(last,map1[key]);
            }
            last=map1[key];
        }
        else
        {
            if(num1!=num){
                ListNode1* n=new ListNode1(key,value);
                make_piar(last,n);
                last=n;
                num1++;
                map1[key]=n;
            }
            else{
                map<int,ListNode1*>::iterator iter=map1.find((head->next)->K);
                map1.erase(iter);
                ListNode1* n=new ListNode1(key,value);
                make_piar(last,n);
                map1[key]=n;last=n;
                ListNode1* m=(head->next)->next;
                make_piar(head,m);
            }
        }
    }
};

能AC 真的很不容易就是说。。。
请添加图片描述

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

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

相关文章

第四届全国人工智能大赛答疑分享会等你围观

为了帮助参赛团队更精准地理解赛题、更合理地运用AI相关技术&#xff0c;第四届全国人工智能大赛组委会诚邀鹏城实验室副研究员杨文瀚老师为大家进行AI视觉特征编码赛题解析与答疑&#xff0c;并分享《交通场景下的高效紧致特征表达》。 此次答疑分享会将于5月26日&#xff08…

供应商管理软件如何帮助企业提高盈利能力?

为了在当今快节奏的商业环境中保持竞争力和刺激增长&#xff0c;供应商管理技术正变得至关重要。供应商管理是任何公司最关键的因素之一&#xff0c;其中包括考核供应商、采购及招投标管理、协同管理等多项任务。 随着成熟的供应商管理软件的出现&#xff0c;企业主现在可以优…

三大特性之多态

文章目录 静态的多态动态的多态虚函数虚函数的重写&#xff08;覆盖&#xff09;利用虚函数重写实现多态重写的两个例外1.协变2.析构函数的函数名不同 C11的override和final 重载&#xff0c;重写&#xff08;覆盖&#xff09;&#xff0c;重定义&#xff08;隐藏&#xff09;抽…

什么是客户旅程,为什么它很重要?

多年来&#xff0c;企业专注于客户接触点来衡量客户满意度。近年来&#xff0c;企业已经看到接触点并不能捕捉到全貌。客户接触点只能在一个时间点衡量满意度。他们不一定保证客户对他们的整个旅程感到满意。但什么是客户接触点&#xff1f;是客户与企业互动的特定时刻&#xf…

怎么格式化只读U盘?

用户在格式化期间遇到磁盘只读&#xff08;写保护&#xff09;问题是比较常见的。通常&#xff0c;如果你的U盘处于写保护状态&#xff0c;则它便是只读&#xff0c;不允许你删除或修改U盘上的任何文件&#xff0c;以保护U盘的数据安全。如果需要只读u盘怎么格式化的问题&#…

免费的SVG在线编辑器大推荐

随着响应网络的发展&#xff0c;越来越多的高质量的SVG在线编辑器被公众所熟知。SVG矢量图形也越来越受欢迎&#xff0c;以便在任何设备上呈现图像&#xff0c;甚至一些易于使用的SVG在线编辑器&#xff0c;可以替代PS&#xff0c;本文总结了五种流行的SVG在线编辑器。 1.即时…

使用Windbg静态分析dump文件的完整过程介绍

目录 1、概述 2、静态分析dump文件的一般步骤 2.1、查看异常类型 2.2、使用.ecxr命令切换到发生异常的线程上下文&#xff0c;查看发生异常的那条汇编指令 3、问题分析实例说明 4、使用Windbg详细分析dump文件&#xff0c;展现完整分析过程 4.1、查看异常类型和发生崩溃…

FreeRTOS:队列

目录 前言一、队列简介1.1数据存储1.2多任务访问1.3出队阻塞1.4入队阻塞1.5队列操作过程图示1.5.1创建队列1.5.2向队列发送第一个消息1.5.3向队列发送第二个消息1.5.4从队列中读取消息 二、队列结构体三、队列创建3.1创建函数3.2函数xQueueCreateStatic()3.3函数xQueueCreate()…

隐私计算论文合集「联邦学习系列」第2期

前言&#xff1a; 隐语awesome-PETs&#xff08;PETs即Privacy-Enhancing Technologies &#xff0c;隐私增强技术&#xff09;精选业内优秀论文&#xff0c;按技术类型进行整理分类&#xff0c;旨在为隐私计算领域的学习研究者提供一个高质量的学习交流社区。awesome-pets包含…

集权设施攻防兵法:实战攻防之AD篇

一、黑客眼中的AD AD域是攻击者经常攻击的目标&#xff0c;因为AD域作为企业的核心身份验证和授权系统&#xff0c;攻击AD域可以使攻击者获得系统内所有计算机和用户的权限&#xff0c;从而轻松获取敏感信息和控制企业系统。 另外&#xff0c;AD域内存在众多的计算机资产&…

使用git在Github上创建自己的项目及一些基础操作

使用git在Github上创建自己的项目及一些基础操作 一、什么是git Git 是一个开源的分布式版本控制系统&#xff0c;用于敏捷高效地处理任何或小或大的项目。 Git 是 Linus Torvalds 为了帮助管理 Linux 内核开发而开发的一个开放源码的版本控制软件。 Git 与常用的版本控制工具…

Doris安装

Apache Doris 由百度大数据部研发&#xff08;之前叫百度 Palo&#xff0c;2018 年贡献到 Apache 社区后&#xff0c; 更名为 Doris &#xff09;&#xff0c;在百度内部&#xff0c;有超过 200 个产品线在使用&#xff0c;部署机器超过 1000 台&#xff0c;单一 业务最大可达…

Mac app文件签名与公证

一、Mac app文件签名与公证 在钥匙串中创建要公证app的profile&#xff08;公证的时候会用到&#xff09; xcrun notarytool store-credentials "mac_app" --apple-id "xxxxxxxx163.com" --team-id "S24Z9326XX" --password "fnjx-qjoe-l…

PYTHON制作前后端分离的图书信息管理系统(flask+vue)

前言 嗨喽&#xff0c;大家好呀~这里是爱看美女的茜茜呐 本次案例&#xff0c;使用 flask、vue、elements-plus、axios 制作一个基于 restful api 的前后端分离的图书信息管理案例 效果展示 &#x1f447; &#x1f447; &#x1f447; 更多精彩机密、教程&#xff0c;尽在下…

Python 的 type 函数和 isinstance 函数

type()、isinstance()都是对象类型操作函数&#xff0c;用于判定对象类型&#xff0c;用哪个函数更好哩&#xff1f; 【学习的细节是欢悦的历程】 Python 官网&#xff1a;https://www.python.org/ Free&#xff1a;大咖免费“圣经”教程《 python 完全自学教程》&#xff0c;…

数字档案馆建设指南

数字档案馆建设指南 目 录 1.总体要求 2.管理系统功能要求 3.应用系统开发和服务平台构建 4.数字档案资源建设 5.保障体系建设 1.总体要求 1.1概述 数字档案馆是指各级各类档案馆为适应信息社会日益增长的对档案信息资源管理、利用需求&#xff0c;运用现代信息技术对数字…

一只羊的奥秘,您可知羊是有四个胃的噢

很多人知道反刍动物&#xff0c;但是对于反刍动物的四个胃怎样消化&#xff0c;不太了解&#xff0c;今天小编就介绍一下&#xff0c;反刍动物为何需要四个胃消化食物。 反刍俗称倒嚼&#xff0c;是指某些动物进食经过一段时间以后将半消化的食物从胃里返回嘴里再次咀嚼。反刍主…

有效项目进度管理的 10 条规则

项目进度管理是项目中比较关键的方面之一&#xff0c;因为它将决定事情的进展方式、进展速度以及是否会取得进展。换句话说&#xff0c;它可以让你较好地控制项目&#xff0c;帮助你预测不可预测的情况&#xff0c;并使所有相关团队能够高效地协同工作。 以下是有效项目进度管…

如何在华为OD机试中获得满分?Java实现【寻找两个正序数组的中位数】一文详解!

✅创作者&#xff1a;陈书予 &#x1f389;个人主页&#xff1a;陈书予的个人主页 &#x1f341;陈书予的个人社区&#xff0c;欢迎你的加入: 陈书予的社区 &#x1f31f;专栏地址: Java华为OD机试真题&#xff08;2022&2023) 文章目录 1. 题目描述2. 输入描述3. 输出描述…

3.数据结构期末复习之栈和队列

1.栈的应用 1.括号匹配问题(还有确定他们的符号优先级) 如 2((32) * 3) /3 扫描到左括号入栈,右括号入另外一个栈,如果两个栈数量相同,则是匹配的,不保存,不然去找最少的栈,出来提示报错2.十进制转2进制 如 23转二进制10111&#xff0c;需要栈辅助 每次除2的余数倒过来写3.mai…