时隔十年,再次上路 LRU缓存

news/2024/11/17 21:19:16/

这个博客是为了十年前找工作时候创建的,用来记录自己的积累,没想到,一晃十年,我又回到了这里,想Mark下,时光弹指一瞬,令人唏嘘。

记录一道代码题吧。

力扣

Problem: 146. LRU 缓存

思路
解题方法
复杂度
Code
思路
使用一个Map来存储数据,使用双端链表来做LRU元素排序,新访问的元素插入表尾,最早的元素就被排序到表头了。

解题方法
注意元素为0个的判定和处理。map里要保存在双端链表的位置,使用一个node结构体都保存了

复杂度
时间复杂度:
get是o(1), put也是o(1)

空间复杂度:
o(n)


class LRUCache {private class Node {int key;int value;Node pre;Node next;Node(int k, int v) {key = k;value = v;pre = next = null;}Node() {}}HashMap<Integer, Node> cache;int capacity;int size;Node head;public LRUCache(int capacity) {this.capacity = capacity;size = 0;head = new Node();head.next = head.pre = head;cache = new HashMap<Integer, Node>();}public int get(int key) {Node data = cache.get(key);if(data != null) {Node pre = data.pre;Node next = data.next;pre.next = data.next;next.pre = data.pre;pre = head.pre;pre.next = data;data.pre = pre;data.next = head;head.pre = data;return data.value;} else {return -1;}}public void put(int key, int value) {Node n = cache.get(key);if(n != null) {n.value = value;n.pre.next = n.next;n.next.pre = n.pre;Node pre = head.pre;pre.next = n;n.pre = pre;n.next = head;head.pre = n;} else {Node newNode = new Node(key, value);Node pre = head.pre;head.pre = newNode;newNode.next = head;if(pre != null) {pre.next = newNode;newNode.pre = pre;} else {head.next = newNode;newNode.pre = head;}cache.put(key, newNode);size++;if(size > capacity) {Node delNode = head.next;Node next = delNode.next;head.next = next;next.pre = head;cache.remove(delNode.key);size--;}}}
}/*** 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);*/作者:neomcgo
链接:https://leetcode.cn/problems/lru-cache/solutions/2334297/lruhuan-cun-by-neomcgo-3ozo/
来源:力扣(LeetCode)
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。


http://www.ppmy.cn/news/774588.html

相关文章

硬件电路设计--运算放大器(一)参数和分类

文章目录 前言一、运放分类1.1 功能分类1.2 按单颗IC封装1.3 第一脚的判断 二、运放参数2.1 理想运放2.2 实际运放2.3 数据手册中的重要参数2.3.1 供电电压Vs&#xff08;power supply&#xff09;2.3.2 虚短虚断2.3.3 输入偏置电流Ib2.3.4 噪声Vn2.3.5 静态电流IQ2.3.6 输入失…

lotus-shed 更改 Owner

lotus-shed 更改 Owner # lotus-shed actor set-owner --help NAME:lotus-shed actor set-owner - Set owner address (this command should be invoked twice, first with the old owner as the senderAddress, and then with the new owner)USAGE:lotus-shed actor set-owne…

组装一台计算机的配置,要不要自己动手组装一台电脑?一文告诉你答案!

如今&#xff0c;自己动手组装一台电脑成为了越来越多小伙伴的选择&#xff0c;最重要的原因就是因为DIY经济实惠&#xff0c;同样的一台电脑在电脑城可能要花费5000块&#xff0c;而自己从网上买配件组装的话可能4000多块就可以拿下&#xff0c;这节省的1000块可以让我们做很多…

组装电脑什么配置才适合自己

我是小虾&#xff0c;非常高兴又很大家见面&#xff0c;今天跟大家说下&#xff0c;组装电脑什么配置好这个问题&#xff0c;其实非常的简单各有各的需求吧&#xff0c;也没有什么好的坏的&#xff0c;实用就好。按自己的需求来选择电脑配置这才是最人性化的&#xff0c;大家不…

组装一台计算机必需的配件有,哪位可以告诉我自己想组装一台电脑需要那些配件...

雨季871 回答数&#xff1a;8655 | 被采纳数&#xff1a;0 2016-11-29 12:24:29 组装电脑需要的配件&#xff1a; 1、主板 电脑机箱主板&#xff0c;又叫主机板(mainboard)、系统板(systemboard)或母板(motherboard)&#xff1b;它分为商用主板和工业主板两种。它安装在机箱内…

Linux: network: tcp:如何主动从外围kill socket ;ss -K;CONFIG_INET_DIAG_DESTROY

文章目录 参考ss 命令引进的commit依赖 INET_DIAG_DESTROY 这个配置参考 https://www.man7.org/linux/man-pages/man8/ss.8.html ss 命令 .diag_destroy = tcp_abort, -K, --kill 这个参数可以强制从外围关闭sockets。如果关闭成功,就会显示这些关闭成功的sockets。如果内核…

(02)Cartographer源码无死角解析-(72) 2D后端优化→OptimizationProblem2D-约束残差、landmark残差

讲解关于slam一系列文章汇总链接:史上最全slam从零开始,针对于本栏目讲解(02)Cartographer源码无死角解析-链接如下: (02)Cartographer源码无死角解析- (00)目录_最新无死角讲解:https://blog.csdn.net/weixin_43013761/article/details/127350885 文末正下方中心提供了本…

进程间通信(7)——套接字

0. 前言 进程通信的概念最初来源于单机系统。由于每个进程都在自己的地址范围内运行&#xff0c;为保证两个相互通信的进 程之间既互不干扰又协调一致工作&#xff0c;操作系统为进程通信提供了相应设施&#xff0c;如&#xff1a; UNIX BSD&#xff1a;管道(pipe)、命名管道…