146. LRU 缓存机制

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);*/

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/390337.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

[SQL] 请教一下 count里面有case when 一般情况下啥时候用

http://www.itpub.net/forum.php?modviewthread&tid1810967 问题: 比如 count(case when pday_id${deal_date} then 1 end) 我有点想不明白具体什么情况下count() 这个小括号里面还要用case when 大家做BI统计的时候一般什么情况用啊 还有个…

路由器架设虚拟服务器让外网访问到本地网站

确定电脑与路由器正确连接,并且已连至互联网。在地址栏中输入192.168.0.1回车,输入用户名密码,进入路由器主界面。 然后点击左侧菜单中的“虚拟服务器”,——“端口段映射”打开“端口段映射”界面。 由于网站用的是80端口&#x…

vue项目示例代码git_您应该了解的5个Git命令以及代码示例

vue项目示例代码gitIve used Git for some years now, and I still find myself googling how to do some basic tasks. So this article is my attempt to learn how to do some of these things by writing about them. And even if I still forget, at least Ill have a ref…

413. 等差数列划分

413. 等差数列划分 如果一个数列 至少有三个元素 ,并且任意两个相邻元素之差相同,则称该数列为等差数列。 例如,[1,3,5,7,9]、[7,7,7,7] 和 [3,-1,-5,-9] 都是等差数列。 给你一个整数数组 nums ,返回数组 nums 中所有为等差数组…

山羊与汽车游戏的实验算法

实验1: function shuffle(target) {var j, x, i target.length;for (; i > 0; j parseInt(Math.random() * i), x target[--i], target[i] target[j], target[j] x) {}return target }function removeAt(target, index) {return !!target.splice(index, 1).…

selenium模块

selenium模块 阅读目录 一 介绍二 安装三 基本使用四 选择器五 等待元素被加载六 元素交互操作七 其他八 项目练习一 介绍 selenium最初是一个自动化测试工具,而爬虫中使用它主要是为了解决requests无法直接执行JavaScript代码的问题selenium本质是通过驱动浏览器,完…

关闭iphone来电mac_如何在Mac和iPhone上关闭通用剪贴板切换(以及为什么要禁用此功能)

关闭iphone来电macIm about to tell you something that will shock you, and probably make you very angry. I hope you wont hate me for it. Here goes.我正要告诉您一些令您震惊的事情,并可能使您非常生气。 我希望你不会为此而恨我。 开始。 If you are an i…

关于tomcat Post 数据参数的问题

2019独角兽企业重金招聘Python工程师标准>>> POST请求本身并未限制传入参数大小&#xff0c;是tomcat 容器设置了接收参数大小的限制。修改server.xml <Connector port"8080" protocol"HTTP/1.1" connectionTimeout"2000" red…

iOS:通信录(完成)(18-01-18更)

1、读取通信录 1&#xff09;、9.0以前&#xff1a;AddressBook 2&#xff09;、9.0以后&#xff1a;Contacts 2、调用通信录UI&#xff08;不弄&#xff09; 1&#xff09;、9.0以前&#xff1a;AddressBookUI 2&#xff09;、9.0以后&#xff1a;ContactsUI 3、参考 0、写在前…

如何在React Native和Firebase中设置Google登录

Google sign-in is a great login feature to offer to your apps users. It makes it easier for them to create an account and sign in. Google登录是一项出色的登录功能&#xff0c;可为您的应用程序用户提供。 这使他们更容易创建帐户并登录。 And whats even better, F…

设计模式-发布订阅模式

这段时间在看vue的双向绑定原理&#xff0c;知道了vue的核心三大件&#xff1a;Observer, Complie, Watcher。 Observer用于监听属性的变化&#xff0c;如有变动就通知 Watcher。 Compile负责解析元素节点的指令&#xff0c;如v-if&#xff0c;v-bind之类, 进行数据和回调函数的…

杜教筛--51nod1239 欧拉函数之和

求$\sum_{i1}^{n}\varphi (i)$&#xff0c;$n\leqslant 1e10$。 这里先把杜教筛的一般套路贴一下&#xff1a; 要求$S(n)\sum_{i1}^{n}f(i)$&#xff0c;而现在有一数论函数$g(i)$&#xff0c;$g(i)$的前缀和很无脑&#xff0c;且$f$和$g$的狄利克雷卷积的前缀和很无脑&#xf…

【Android Studio安装部署系列】目录

概述 从刚开始使用Android Studio到现在&#xff0c;下面所有目录下的操作&#xff0c;当时习惯性的把每一个整理成一个文档&#xff08;其实就是简单文字描述截图&#xff09;&#xff1b;有些地方当时是一知半解&#xff0c;现在会稍微明白一些。正好赶上现在有时间。所以就想…

修改npm全局安装模式的路径

修改npm全局安装模式的路径 在正式写此文章之前&#xff0c;我得说一点血泪史。 刚学nodeJS不久&#xff0c;很纳闷为什么全局安装的模块在 node安装目录/node_modules‘ 中没找到&#xff01;后来仔细看了下安装成功后的信息&#xff0c;才发现原来是自动安装在C盘了&#xff…

javascript创建类_如何使用JavaScript创建吹气效果

javascript创建类Have you ever wondered how you can create a realistic air blowing effect with JavaScript? Like the one shown on the evening TV shows, where multiple balls are being mixed up in a sphere-like object by leveraging air pressure? If you want …

Bootstrap 4:如何使顶部固定的Navbar保持在容器中而不拉伸?

There are many ways to make a fixed navbar stay inside a parents div container. Well go over the most straightforward one here.有很多方法可以使固定的导航栏停留在父级的div容器中。 我们将在这里介绍最简单的方法。 Imagine you have the following code, modified…

基于SpringBoot+Mybatis+Thymeleaf商品信息管理系统

github地址&#xff1a;github.com/zaiyunduan1…,如果对你有帮助&#xff0c;欢迎Star 主要用到的技术&#xff1a; 使用maven进行项目构建使用SpringbootMybatis搭建整个系统使用Thymeleaf模板技术实现页面静态化使用框架Bootstrap、JQuery开发前端界面使用MySQL和MongoDB分别…

在Mac上为自己手动编译安装一套PHP7的开发环境

首先你得去官网下载php7 beta1的版本 这里由于我是在mac上安装&#xff0c;所以就去下载linux相关的版本&#xff0c;地址也直接附上了php7 beta1windows版的官方也有发布详情猛戳&#xff1a;这里 解压安装包&#xff0c;进入源代码目录 tar -zxvf php-7.0.0beta1.tar.gz cd p…

卡特兰数 HDU2067 HDU4165 HDU1134

题目链接&#xff1a;https://vjudge.net/problem/HDU-2067 小兔的棋盘 Time Limit: 1000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total Submission(s): 11800 Accepted Submission(s): 5952 Problem Description小兔的叔叔从外面旅游回来给她…

Python的用途是什么? Python编程语言有10多种编码用途。

&#x1f44b;欢迎 (&#x1f44b; Welcome) Hi! Please take a moment to think about this question: 嗨&#xff01; 请花一点时间考虑这个问题&#xff1a; How is Python applied in real-world scenarios? Python如何在实际场景中应用&#xff1f; If you are learnin…