当前位置: 首页 > article >正文

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

函数 get 和 put 必须以 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.hashmap[key].val = value

            # 然后放到tail去

            rt = self.hashmap[key]

            # 删除原本的

            self.remove_to_tail(rt)


 

        else:

            temp = ListNode(key,value)

            if self.num_nodes<self.capacity:

                self.hashmap[key]=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.hashmap[dele.key]

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

                self.hashmap[key]=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很可能被删除,不好写


http://www.kler.cn/a/452384.html

相关文章:

  • 赛博错题本
  • 《Web 搜索引擎优化》
  • TLDR:终端命令的简洁百科全书
  • 面试场景题系列:设计一致性哈希系统
  • flask-admin的modelview 实现list列表视图中扩展修改状态按钮
  • 内网穿透ubuntu20 docker coplar
  • docker 安装雷池WAF防火墙 守护Web服务器
  • 软件工程课程知识点
  • 解决需要用到1.x版本的tensorflow环境的问题
  • 【递归与回溯深度解析:经典题解精讲(上篇)】—— LeetCode
  • 每天40分玩转Django:Django表单集
  • 在 Mac M2 上安装 PyTorch 并启用 MPS 加速的详细教程与性能对比
  • 使用Python探索量子机器学习
  • ByConity BSP 解锁数据仓库新未来
  • Android DRM 技术详解与应用实践
  • HarmonyOS NEXT 实战之元服务:静态案例效果--- 手机一键加速、手机垃圾清理
  • 中阳智能:量化交易助力科技与金融融合
  • 基于LSTM长短期记忆神经网络的多分类预测【MATLAB】
  • 跟我学c++中级篇——C++中的缓存利用
  • 达梦数据库-数据共享集群部署
  • vue3导入excel并解析excel数据渲染到表格中,纯前端实现。
  • CSS 居中技术完全指南:从基础到高级应用
  • SpeedTree For UE5学习笔记
  • 分布式Python计算服务MaxFrame使用心得
  • <代码随想录> 算法训练营-2024.12.25
  • Linux零基础速成篇一(理论+实操)