力扣labuladong一刷day52天LRU算法

力扣labuladong一刷day52天LRU算法

文章目录

      • 力扣labuladong一刷day52天LRU算法
      • 概念
      • 一、146. LRU 缓存
        • 思路一:使用双向链表加map来手动实现。
        • 思路二:使用LinkedHashMap

概念

LRU的全称为Least Recently Used,翻译出来就是最近最少使用的意思,它是一种内存淘汰算法,当内存不够时,将内存中最久没使用的数据清理掉。 LUR算法是内存管理的一种页面置换算法,就是用来删除内存中不被使用的数据,腾出空间来把常用的数据存进去。

一、146. LRU 缓存

题目链接:https://leetcode.cn/problems/lru-cache/

思路一:使用双向链表加map来手动实现。
class Node {public int key, val;public Node next, prev;public Node(int k, int v) {key = k;val = v;}
}class DoubleList{private Node head, tail;private int size;public DoubleList() {head = new Node(0, 0);tail = new Node(0, 0);head.next = tail;tail.prev = head;size = 0;}void addLast(Node x) {x.next = tail;x.prev = tail.prev;tail.prev.next = x;tail.prev = x;size++;}void remove(Node x) {x.prev.next = x.next;x.next.prev = x.prev;size--;}Node removeFirst() {if (head.next == tail) {return null;}Node first = head.next;remove(first);return first;}int size() {return size;}
}class LRUCache{private HashMap<Integer, Node> map;private DoubleList cache;private int cap;public int get(int key) {if (!map.containsKey(key)) {return -1;}makeRecently(key);return map.get(key).val;}public void put(int key, int value) {if (map.containsKey(key)) {deleteKey(key);addRecently(key, value);return;}if (cap == cache.size()) {deleteLastRecently();}addRecently(key, value);}public LRUCache(int capacity) {this.cap = capacity;this.map = new HashMap<>();this.cache = new DoubleList();}private void makeRecently(int key) {Node node = map.get(key);cache.remove(node);cache.addLast(node);}private void addRecently(int key, int value) {Node node = new Node(key, value);map.put(key, node);cache.addLast(node);}private void deleteKey(int key) {Node node = map.remove(key);cache.remove(node);}private void deleteLastRecently() {Node node = cache.removeFirst();map.remove(node.key);}}/*** Your LRUCache object will be instantiated and called as such:* LRUCache obj = new LRUCache(capacity);* int param_1 = obj.get(key);* obj.put(key,value);*/
思路二:使用LinkedHashMap

put都是从尾部加入,要想删除头部可以使用map.keySet().iterator().next();拿到key,然后删除。

class LRUCache {LinkedHashMap<Integer, Integer> map;int cap = 0;public LRUCache(int capacity) {map = new LinkedHashMap<>();cap = capacity;}public int get(int key) {if (!map.containsKey(key)) {return -1;}Integer val = map.remove(key);map.put(key, val);return val;}public void put(int key, int value) {if (map.containsKey(key)) {map.remove(key);map.put(key, value);return;}if (cap <= map.size()) {Integer first = map.keySet().iterator().next();map.remove(first);}map.put(key, value);}
}

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

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

相关文章

有网友希望我推荐几个创建产品手册工具,这不就来了!

上次我有说到&#xff0c;企业应该充分认识到产品手册的重要性&#xff0c;并采取有效的策略和措施来制作和传播高质量的产品手册&#xff0c;以提升品牌知名度和市场份额。后台有网友问我除了设计排版的那种产品手册工具&#xff0c;还有什么方式可以去做产品手册。今天就介绍…

『App自动化测试之Appium应用篇』| Appium常用API及操作

『App自动化测试之Appium应用篇』| Appium常用API及操作 1 press_keycode1.1 键盘操作1.2 关于KeyCode1.3 press_keycode源码1.4 电话键相关1.5 控制键相关1.6 基本按键相关1.7 组合键相关1.8 符号键相关1.9 使用举例 2 swip方法2.1 swip说明2.2 swip使用方法2.3 使用示例 3 sc…

用redis广播消息更新集群环境下本地缓存

前言 在软件系统开发中&#xff0c;有时需要将系统元数据放在数据库中&#xff0c;使用时再从数据库中查询。为避免频繁访问数据库&#xff0c;提升系统性能&#xff0c;需要将更新不频繁的数据放到本地缓存中。在元数据变动的时候再更新本地缓存。如果单节点时不存在问题&…

unity中 canvas下物体的朝向跟随

public Transform target; private Vector3 direction; void Update() { //第一种 //direction target.position - transform.position; //transform.up -direction.normalized; //第二种 if (target ! null ) { …

obs-studio build

源码下载&#xff1a; git clone --recursive https://github.com/obsproject/obs-studio.git 提交点&#xff1a;4176f9b13aa9278dbc6c0b0c366f7f7b9ef8c68c git submodule update --init --recursive 下载依赖项&#xff1a; windows Releases obsproject/obs-deps…

【数值分析】非线性方程求根,二分法,割线法,matlab实现

1. 基本问题 收敛阶 lim ⁡ k → ∞ ∣ e k 1 ∣ ∣ e k ∣ r C > 0 , r 为收敛阶 \lim_{k\to\infty} \frac{|e_{k1}|}{|e_k|}^rC>0 \,\,,\,\, r为收敛阶 k→∞lim​∣ek​∣∣ek1​∣​rC>0,r为收敛阶 2. 二分法 二分法是线性收敛的&#xff0c;如果指定精度 …

Spring Data JPA入门到放弃

参考文档&#xff1a;SpringData JPA&#xff1a;一文带你搞懂 - 知乎 (zhihu.com) 一、 前言 1.1 概述 Java持久化技术是Java开发中的重要组成部分&#xff0c;它主要用于将对象数据持久化到数据库中&#xff0c;以及从数据库中查询和恢复对象数据。在Java持久化技术领域&a…

docker-compose常用命令及.yaml配置模板

1、docker-compose常用命令&#xff1a; docker-compose -f mysql-docker-compose.yaml up -d docker-compose -f mysql-docker-compose.yaml downdocker-compose的常用命令包括&#xff1a; docker-compose up&#xff1a;启动并运行Compose文件中的服务。 docker-compose st…

英飞凌TC3xx之一起认识GTM(九)GTM相关知识简述(CMU,CCM,TBU,MON)

英飞凌TC3xx之一起认识GTM(九)GTM相关知识简述(CMU,CCM,TBU,MON) 1 时钟管理单元(CMU)2 集群配置模块(CCM)3 时基单元(TBU)4 监控单元(MON)5 总结由前文的各篇内容,开发者已经知道如何使用GTM的大部分功能,在这些功能中,都需要一个信息就是fGTM 的数据,我们在前…

Vue2和Vue3框架介绍以及使用

Vue2和Vue3框架介绍&#xff1a; Vue2是Vue.js的早期版本&#xff0c;它引入了组件化的开发方式&#xff0c;使得开发人员可以更加模块化地构建单页应用程序。Vue2还提供了响应式的数据绑定和指令&#xff0c;使得开发人员可以更加高效地开发动态的Web界面。 Vue2的特点&…

【源码预备】Calcite基础知识与概念:关系代数概念、查询优化、sql关键字执行顺序以及calcite基础概念

文章目录 一. 关系代数的基本知识二. 查询优化三. SQL语句的解析顺序1. FROM2. WHERE3. GROUP BY4. HAVING5. SELECT 四. Apache Calcite中的基本概念1. Adapter2. Calcite中的关系表达式2.1. 关系表达式例子2.2. 源码底层结构 3. Calcite的优化规则4. Calcite的Trait--算子物理…

使用群晖docker将小爱音箱接入chatgpt

文章目录 开源项目地址获取设备did&#xff0c;设备hardware配置文件分享上传配置文件群晖后台启动服务检查服务状态&#xff0c;测试 开源项目地址 获取设备did&#xff0c;设备hardware 使用Yonsm/MiService项目获取did和hardware。 找个Ubuntu环境安装python环境&#xff…

音乐制作软件Studio One mac有哪些特点

Studio One mac是一款专业的音乐制作软件&#xff0c;该软件提供了全面的音频编辑和混音功能&#xff0c;包括录制、编曲、合成、采样等多种工具&#xff0c;可用于制作各种类型的音乐&#xff0c;如流行音乐、电子音乐、摇滚乐等。 Studio One mac软件特点 1. 直观易用的界面&…

Golang switch 语句

简介 switch 语句提供了一种简洁的方式来执行多路分支选择 基本使用 基本语法如下&#xff1a; switch expression { case value1:// 当 expression 的值等于 value1 时执行 case value2:// 当 expression 的值等于 value2 switch 的每个分支自动提供了隐式的 break&#x…

x-cmd pkg | pdfcpu - 强大的 PDF 处理工具

目录 简介首次用户多功能支持性能表现安全的加密处理进一步阅读 简介 pdfcpu 是一个用 Go 编写的 PDF 处理库。同时它也提供 API 和 CLI。pdfcpu 提供了丰富的 PDF 操作功能&#xff0c;用户还能自己编写配置文件&#xff0c;用来管理和使用各种自定义字体并存储有效的默认配置…

苹果紧急修复两大零日漏洞,影响iPhone、iPad 和 Mac 设备

内容概述&#xff1a; 近日&#xff0c;苹果公司发布紧急安全更新&#xff0c;此次更新修复了两个在攻击中被利用并影响 iPhone、iPad 和 Mac 设备的零日漏洞。据统计&#xff0c;自今年年初以来已修复的零日漏洞数量已达到 20 个。其中提到此次发现的零日漏洞很可能已被iOS 1…

uniapp 【专题详解 -- 时间】云数据库时间类型设计,时间生成、时间格式化渲染(uni-dateformat 组件的使用)

云数据表的时间类型设计 推荐使用时间戳 timestamp "createTime": {"bsonType": "timestamp","label": "创建时间&#xff1a;" }时间生成 获取当前时间 Date.now() .add({createTime: Date.now() })时间格式化渲染 下载安…

音量控制软件sound control mac功能亮点

sound control mac可以帮助用户控制某个独立应用程序的音量&#xff0c;通过每应用音量&#xff0c;均衡器&#xff0c;平衡和音频路由独立控制每个应用的音频&#xff0c;还有整个系统的音量。 sound control mac功能亮点 每个应用程序的音量控制 独立控制应用的数量。 键盘音…

发票信息提取v1.2.0

程序介绍 “发票信息提取”是一款用于提取电子发票的PDF、XML文件中的开票信息到excel表格的软件&#xff0c;无需联网及进行复杂配置&#xff0c;打开即用。目前支持增值税电子发票&#xff08;非数电票&#xff09;原始PDF文件&#xff0c;及数电票的XML文件。 更新内容 增加…

PHP运行环境之宝塔Web站点部署

目录 Web站点部署流程(部署聚合支付后台) 项目文件 将上传的文件解压文件至根目录 修改站点关键信息 设置伪静态,选择:thinkphp,并保存 设置PHP,选择:70+版本即可。 安装网站 1设置运行目录