146. LRU 缓存机制

运用你所掌握的数据结构,设计和实现一个 LRU (最近最少使用) 缓存机制 。
实现 LRUCache 类:

LRUCache(int capacity) 以正整数作为容量 capacity 初始化 LRU 缓存
int get(int key) 如果关键字 key 存在于缓存中,则返回关键字的值,否则返回 -1 。
void put(int key, int value) 如果关键字已经存在,则变更其数据值;如果关键字不存在,则插入该组「关键字-值」。当缓存容量达到上限时,它应该在写入新数据之前删除最久未使用的数据值,从而为新的数据值留出空间。

进阶:你是否可以在 O(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

解题思路

基于链表和hashmap实现LRU

  1. 每次新增key的时候,如果key已经存在了,就将key移到链表头,并且修改value。如果key不存在,直接将key插入队头。如果已经超出LRU的大小,就删除链表尾部的key
  2. 每次get的时候,如果key存在,就将这个key移到链表头,并且返回

代码

type LRUCache struct {capacity inthead *Nodetail *Nodecache map[int]*Node
}
type Node struct {pre *Nodenext *Nodekey intval int
}var c LRUCache
func Constructor(capacity int) LRUCache {c.cache= map[int]*Node{}c.capacity=capacityc.head=&Node{val: -1}c.tail=&Node{val: -1}c.head.next=c.tailc.tail.pre=c.headreturn  c
}func (lru *LRUCache) Get(key int) int {node,ok := c.cache[key]if ok {p,n := node.pre,node.nextp.next=nn.pre=pth:=lru.head.next//插入头节点lru.head.next=nodenode.pre=lru.headnode.next=thth.pre=nodereturn node.val}return -1
}func (lru *LRUCache) Put(key int, value int)  {if lru.Get(key)!=-1 {lru.head.next.val=valuereturn}if lru.capacity==0 {delete(lru.cache,lru.tail.pre.key)tl := lru.tail.pre.pretl.next=lru.taillru.tail.pre=tllru.capacity++}node := &Node{key: key,val:  value,next:  lru.head.next,pre: lru.head,}lru.head.next.pre=nodelru.head.next=nodelru.cache[key]=nodelru.capacity--
}/*** Your LRUCache object will be instantiated and called as such:* obj := Constructor(capacity);* param_1 := obj.Get(key);* obj.Put(key,value);*/

146. LRU 缓存机制相关推荐

  1. Java实现 LeetCode 146 LRU缓存机制

    146. LRU缓存机制 运用你所掌握的数据结构,设计和实现一个 LRU (最近最少使用) 缓存机制.它应该支持以下操作: 获取数据 get 和 写入数据 put . 获取数据 get(key) - ...

  2. Leetcode 146. LRU缓存机制【哈希表 [哈希表存储每个元素在双向链表中的指针]+双向链表】

    文章目录 问题描述 解题报告 实验代码 参考资料 问题描述 运用你所掌握的数据结构,设计和实现一个 LRU (最近最少使用) 缓存机制.它应该支持以下操作: 获取数据 get 和 写入数据 put . ...

  3. 146. LRU缓存机制

    运用你所掌握的数据结构,设计和实现一个  LRU (最近最少使用) 缓存机制.它应该支持以下操作: 获取数据 get 和 写入数据 put . 获取数据 get(key) - 如果密钥 (key) 存 ...

  4. LeetCode 146. LRU缓存机制(哈希链表)

    文章目录 1. 题目信息 2. 解题 2.1 手动实现list 2.2 使用内置list 1. 题目信息 运用你所掌握的数据结构,设计和实现一个 LRU (最近最少使用) 缓存机制.它应该支持以下操作 ...

  5. LeetCode —— 146. LRU缓存机制(Python)

    运用你所掌握的数据结构,设计和实现一个 LRU (最近最少使用) 缓存机制.它应该支持以下操作: 获取数据 get 和 写入数据 put . 获取数据 get(key) - 如果关键字 (key) 存 ...

  6. [leetcode]146. LRU缓存机制

    1.LRU(最近最少使用)缓存机制: https://baike.baidu.com/item/LRU/1269842?fr=aladdin 2.用到的数据结构: struct Value {int ...

  7. 【LeetCode】146. LRU缓存机制

    题目描述 运用你所掌握的数据结构,设计和实现一个 LRU (最近最少使用) 缓存机制. 它应该支持以下操作:获取数据 get 和写入数据 put . 获取数据 get(key) - 如果密钥 (key ...

  8. 2021-11-26Leetcode 146.LRU缓存机制

    struct DLinkedNode{int key,value;//key代表某一个进程的页,而value代表页中的数据值DLinkedNode*prev;//前面的节点DLinkedNode*ne ...

  9. C++实现LRU算法(LeetCode 146 LRU缓存机制)

    LRU算法: LRU算法(Least Recently Used)是一种缓存淘汰策略,最近使用的数据是有用的, 如果缓存满了,删除最久没用过的数据 LRU算法描述: (1)设置缓存大小 (2)get: ...

最新文章

  1. 可见的轮廓线用虚线绘制_为什么你用SketchUp没有别人“快”?
  2. Shell脚本_备份/etc数据
  3. μCos-ii学习笔记1_概述
  4. hadoop data join
  5. 三维列表转换成数组时,维度却只有二维
  6. decode 类似 case when
  7. 【今日CS 视觉论文速览】4 Jan 2019
  8. jfreechart 多参数传递
  9. java: 代码过长_给初学Java,知道这4点太重要了!
  10. Mysql 索引入门
  11. html盒子如何左对齐,【图片】怎么才能让盒子里的LI标签在实现的时候左对齐?在线等急!!!!【web前端开发吧】_百度贴吧...
  12. oracle 认证视频,Oracle 认证专家视频教程-OCP全套教程【98集】_IT教程网
  13. 实时 摔倒识别 /运动分析/打架等异常行为识别/控制手势识别等所有行为识别全家桶 原理 + 代码 + 数据+ 模型 开源!
  14. 又一隧道地标,三思点亮万里黄河第一隧
  15. 用友 NC客户化开发手册
  16. Keil5在线调试汇总及基本操作教程
  17. CDH安全认证及使用
  18. 牛客网--16128--小名的回答
  19. Mac升级Catalina,根目录下无法创建个人文件夹
  20. “.”和“->”的区别

热门文章

  1. Linux网络编程——tcp并发服务器(多进程)
  2. ---------愿 青春与我皆不付---------------------
  3. 会话(session)
  4. Java进阶之光!mysql创建用户并授权建表
  5. python字符串是用双引号括起来的_用python连接字符串列表并用引号将每个字符串括起来...
  6. 微信小程序之视图容器(swiper)组件创建轮播图
  7. wget在linux中安装出现错误解决办法
  8. [BZOJ1626][Usaco2007 Dec]Building Roads 修建道路
  9. 如何恢复误删的OneNote页面
  10. Linux 查看磁盘或文件夹及文件大小