leetcode hot100 LRU缓存

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

函数 getput 必须以 O(1) 的平均时间复杂度运行。

class ListNode(object):

def init(self,key,val,next=None,prev=None):

self.val =val

self.key = key

self.next = next

self.prev = prev

class LRUCache(object):

def init(self, capacity):

"""

:type capacity: int

"""

self.capacity = capacity

self.head = ListNode(-1,-1,None,None)

self.tail = ListNode(-1,-1,None,None)

self.head.next=self.tail

self.tail.prev = self.head

self.num_nodes = 0

self.hashmap={}

应该是保存key :node node里面是val

def remove_to_tail(self,rt):

rt.prev.next = rt.next

rt.next.prev = rt.prev

放到末尾,这里有点问题,应为删除的可能就是末尾

prev = self.tail.prev

prev.next = rt

rt.next = self.tail

self.tail.prev = rt

rt.prev = prev

def get(self, key):

"""

:type key: int

:rtype: int

"""

转移到链表的尾部

rt = self.hashmap.get(key,-1)

if rt==-1:

找不到的话,那就return -1

return -1

else:

能找到就找到并且放到末尾

删除原本的,然后放到末尾

如果是末尾的话,根本不用动

if rt==self.tail.prev:

return rt.val

else:

删除原本的

self.remove_to_tail(rt)

return rt.val

def put(self, key, value):

"""

:type key: int

:type value: int

:rtype: None

"""

if self.hashmap.get(key):

print(1111111)

self.hashmapkey.val = value

然后放到tail去

rt = self.hashmapkey

删除原本的

self.remove_to_tail(rt)

else:

temp = ListNode(key,value)

if self.num_nodes<self.capacity:

self.hashmapkey=temp

prev = self.tail.prev

prev.next = temp

temp.next = self.tail

self.tail.prev = temp

temp.prev = prev

self.num_nodes+=1

else:

>=cap,也就是需要我们来删除一个

删除头结点的下一个节点

dele = self.head.next

self.head.next = dele.next

dele.next.prev = self.head

hashmap里面也要删除

print(self.hashmap)

print(dele.key)

del self.hashmapdele.key

删除之后加上最新的到为节点

self.hashmapkey=temp

prev = self.tail.prev

prev.next = temp

temp.next = self.tail

self.tail.prev = temp

temp.prev = prev

如果input的是相同的key会覆盖掉,这个时候num_nodes-1

if key == dele.key:

self.num_nodes-=1

Your LRUCache object will be instantiated and called as such:

obj = LRUCache(capacity)

param_1 = obj.get(key)

obj.put(key,value)

这里我们的思路是,放入需要o1那么直接的我们使用hashmap,key是key value是list节点,同时节点要存储key和value,因为要通过节点进行删除,如果只有value,那就无法再hashmap之中删除

根据LRU的规律我们选择双向链表,因为单向的没有prev和next,无法进行删除操作

需要对于LRU算法非常熟悉才行啊,比如说

插入的时候:

如果没到存储上限,那就直接放到最近使用

如果到达存储上限,那就删除掉最远的,放到最近使用

如果插入的是已经有的,那就把原本的换成现在的,并且放到最近使用

查询:

如果查询到了,把原本节点删除,新节点直接放到最近使用

一些细节:必须要有两个伪装节点head tail因为如果这两个不单独创建的话,删除的时候tail很可能被删除,不好写

相关推荐
码云骑士4 分钟前
116-Python调用GPT-4V分析图片-Base64编码-多图-JSON结构化输出
开发语言·python·json
Zane19945 分钟前
HashSet、TreeSet、LinkedHashSet:底层都是"套壳"
java·后端
88号技师11 分钟前
2026年SCI-分数牛顿衍生优化算法Fractional Newton-derived optimizer-附Matlab免费代码
开发语言·算法·数学建模·matlab·优化算法
承渊政道12 分钟前
【Python编程—从入门到实践】(Python操作列表深度教程:循环、切片、元组与代码风格)
开发语言·python·pycharm·列表·元组·切片
相顾若初见19 分钟前
RuoYi后端jar镜像制作
java·jar
布值倒区什么name20 分钟前
Pycharm2026找不到编译器 点击运行运行不了
开发语言·python·pycharm
MacroZheng26 分钟前
程序员看文档神器,装上它,看Spring官方文档就一目了然了!
java·人工智能·后端
智购科技自动售货机工厂27 分钟前
2026自动售货机电机驱动芯片选型:从L298N到DRV8870的工程实践~YH
大数据·开发语言·数据库·人工智能·单片机·嵌入式硬件·scikit-learn
2501_9159184134 分钟前
Rust 程序抓包解密,rustls 不认系统证书的几种办法
开发语言·后端·网络协议·ios·adb·https·rust
深漂的华哥35 分钟前
Ruoyi-Vue-Plus(V5.6.2) 开发环境搭建
java·前端·spring boot·后端·spring·ruoyi