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

【LeetCode】146. LRU缓存

1.题目

在这里插入图片描述

2.思想

3.代码

3.1 代码1

下面这是一版错误的代码。错误的原因在于逻辑不正确导致最后的代码也是不正确的。

class LRUCache:
    def __init__(self, capacity: int):
        self.time = 0 # 用于全局记录访问的时间
        self.num2time = {} # 数字到时间的映射
        self.key2val = {} # 数字到数字
        self.capacity = capacity
        self.history = [] # 用于记录操作的历史

    # get 也要对时间进行修改
    def get(self, key: int) -> int:         
        if self.key2val.get(key,-1) != -1:
            self.time += 1
            self.num2time[key] = self.time # 更新时间成最新的
            self.history.append(key)
        return self.key2val.get(key,-1)

    def put(self, key: int, value: int) -> None:
        self.time += 1 # 时间戳加1
        self.history.append(key)        
        # 如果目前还没有装满,那么直接放
        if(len(self.key2val) < self.capacity):
            self.key2val[key] = value
        elif(self.key2val.get(key,-1)!=-1):
            self.key2val[key] = value # 直接更新
            self.num2time[key] = self.time
            self.history.append(key)
        else: # 考虑去掉某个数            
            curTime = self.time
            # 获取左侧的时间
            while(self.num2time.get(self.history[0],-1)==-1):
                    del self.history[0] # 删除 第0位 元素
            leftTime = self.num2time[self.history[0]]
            while(curTime - leftTime < self.capacity):
                del self.history[0] # 删除 第0位 元素
                while(self.num2time.get(self.history[0],-1)==-1):
                    del self.history[0] # 删除 第0位 元素
                leftTime = self.num2time[self.history[0]] 

            invalid_key = self.history[0]
            # print("invalid_key = ",invalid_key)
            # print("key2val = ",self.key2val)
            # print("history = ", self.history)
            del self.key2val[invalid_key]
            del self.history[0]
            del self.num2time[invalid_key]
            self.key2val[key] = value
        self.num2time[key] = self.time
        # print("num2time = ", self.num2time)

# Your LRUCache object will be instantiated and called as such:
# obj = LRUCache(capacity)
# param_1 = obj.get(key)
# obj.put(key,value)

错误的逻辑主要在下面这个地方:
在这里插入图片描述
这里的while是想用于找出该删除哪个数,但是这个逻辑并非正确
这里的curTime表示当前的时间,leftTime表示访问栈中最左侧节点的时间。二者的距离与capacity进行比较:

  • 如果距离大于等于capacity,那么就表明需要把这个数删除
    这样依次判断,找出需要退出的那个数即可。

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

相关文章:

  • 策略模式、状态机详细解读
  • 整理iPhone空间:iphone怎么删除相簿
  • 高防服务器的费用受到哪些原因影响?
  • idea 弹窗 delete remote branch origin/develop-deploy
  • 深入探索离散 Hopfield 神经网络
  • Rocky、Almalinux、CentOS、Ubuntu和Debian系统初始化脚本v9版
  • LeetCode 每日一题 2024/9/16-2024/9/22
  • 自然语言处理_tf-idf
  • Java 入门指南:Java 8 新特性 —— Stream 流
  • JavaScript 插入元素到数组三个方法代码示例
  • celery 结合 rabbitmq 使用时,celery 消费者执行时间太久发送 ack 消息失败
  • 【研发日记】嵌入式处理器技能解锁(六)——ARM的Cortex-M4内核
  • 【js常用函数封装】获取年龄,根据身份证获取年龄,性别,生日
  • 算法笔试-编程练习-好题-07
  • 《MmAP : Multi-Modal Alignment Prompt for Cross-Domain Multi-Task Learning》中文校对版
  • Homebrew安装与切换下载源
  • 单例模式(饿汉式-懒汉式)
  • leetcode:3232. 判断是否可以赢得数字游戏(python3解法)
  • FastDFS架构和原理
  • RabbitMQ:交换机详解(Fanout交换机、Direct交换机、Topic交换机)
  • Linux实用命令 df和du命令
  • 数据结构之‘栈’
  • 面向对象程序设计
  • VisionPro - 基础 - 模板匹配技术-Search/PMAlign/PatMax(6)-纹理屏蔽和重叠匹配
  • Redis面试真题总结(四)
  • 多模态交互才是人机交互的未来