手撕LRU缓存——LinkedHashMap简易源码

在这里插入图片描述题目链接:https://leetcode.cn/problems/lru-cache/description/?envType=study-plan-v2&envId=top-100-liked
原理非常简单,一个双端链表配上一个hash表。
首先我们要知道什么是LRU就是最小使用淘汰。怎么淘汰,链表尾部就是最不常用的直接删除,最近使用过的就移动到链表头部。要查找就利用hash表进行映射查找。
代码:

class LRUCache {//需要定义的双端链表节点//哈希表class Node{int key;int value;Node prev;Node next;public Node() {}public Node(int _key,int _value) {key = _key;value = _value;}}private Map<Integer,Node > cache = new HashMap<>();private int size;private int capacity;private Node head,tail;public LRUCache(int capacity) {this.size = 0;this.capacity = capacity;head = new Node();tail = new Node();head.next = tail;tail.prev = head;}public int get(int key) {Node node = cache.get(key);if(node == null) return -1;moveToHead(node);return node.value;}public void put(int key, int value) {//如果存在if(cache.containsKey(key)){Node t = cache.get(key);t.value = value;moveToHead(t);}else{//如果不存在size++;if(size>capacity){cache.remove(tail.prev.key);//System.out.println(tail.prev.key);moveTail();size--;}Node node = new Node(key,value);Node temp = head.next;head.next = node;node.prev = head;temp.prev = node;node.next = temp;cache.put(key,node);}}public void moveToHead(Node node){//本身删除了Node qian = node.prev;qian.next = node.next;node.next.prev = qian;//再插到头部Node temp = head.next;head.next = node;node.prev = head;temp.prev = node;node.next = temp;}public void moveTail(){Node temp = tail.prev.prev;temp.next = tail;tail.prev = temp;}
}/*** 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);*/

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

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

相关文章

vue3批量创建svg icon组件

1、通过插件动态导入svg文件 安装vite插件vite-plugin-svg-icons npm i vite-plugin-svg-icons -D 配置插件svg-icon.ts import { createSvgIconsPlugin } from "vite-plugin-svg-icons"; import path from "path";export default function createSvgI…

好物周刊#42:国产项目管理软件

https://github.com/cunyu1943 村雨遥的好物周刊&#xff0c;记录每周看到的有价值的信息&#xff0c;主要针对计算机领域&#xff0c;每周五发布。 一、项目 1. 菠萝博客 基于 Java 的菠萝博客系统&#xff0c;简单易部署&#xff0c;精致主题&#xff0c;贴心服务&#xf…

模型优化_XGBOOST学习曲线及改进,泛化误差

代码 from xgboost import XGBRegressor as XGBR from sklearn.ensemble import RandomForestRegressor as RFR from sklearn.linear_model import LinearRegression as LR from sklearn.datasets import load_boston from sklearn.model_selection import train_test_split,c…

ChatGPT提示词工程师AI大神吴恩达2023年视频课程学习实践

前言 刚才看了一个视频系列教程&#xff0c;很短&#xff0c;但收获很大&#xff0c;毕竟是一手知识来源&#xff0c;吴恩达大神亲自讲解&#xff0c;他说的话&#xff0c;我都信。这里写个笔记&#xff0c;顺便把知识点实践一下。视频可以去B站上搜索 吴恩达 prompt &#xf…

上门服务系统|上门服务小程序节省时间的必选利器

在如今的快节奏时代&#xff0c;我们的时间越来越宝贵。为了省时省力&#xff0c;越来越多的人选择使用上门服务类小程序。那么&#xff0c;为什么这些小程序能够如此受人欢迎呢&#xff1f;让我们一起揭示其中的原因。 一、方便快捷 上门服务类小程序最大的特点就是方便快捷。…

【探索AI】探索未来-计算机专业必看的几部电影

计算机专业必看的几部电影 计算机专业必看的几部电影&#xff0c;就像一场精彩的编程盛宴&#xff01;《黑客帝国》让你穿越虚拟世界&#xff0c;感受高科技的魅力&#xff1b;《社交网络》揭示了互联网巨头的创业之路&#xff0c;《源代码》带你穿越时间解救世界&#xff0c;…

Zabbix企业运维监控工具

Zabbix企业级监控方案 常见监控软件介绍 Cacti Cacti是一套基于 PHP、MySQL、SNMP 及 RRD Tool 开发的监测图形分析工具&#xff0c;Cacti 是使用轮询的方式由主服务器向设备发送数据请求来获取设备上状态数据信息的,如果设备不断增多,这个轮询的过程就非常的耗时&#xff0…

【驱动】TI AM437x(USB-01):USB Functionfs使用

1、内核、设备树配置USB Functionfs 1.1、配置内核 1)清理 make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- distclean2)生成配置文件.config make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- tisdk_am437x-evm_defconfig3)查看、修改配置项 make ARCH=arm CROSS…

Unity UI适配规则和对热门游戏适配策略的拆解

前言 本文会介绍一些关于UI适配的基础概念&#xff0c;并且统计了市面上常见的设备的分辨率的情况。同时通过拆解目前市面上较为成功的两款休闲游戏Royal Match和Monopoly GO(两款均为近期游戏付费榜前几的游戏)&#xff0c;大致推断出他们的适配策略&#xff0c;以供学习和参…

WebServer -- 日志系统(下)

目录 &#x1f33c;整体思路 &#x1f382;基础API fputs 可变参数宏 __VA_ARGS__ fflush &#x1f6a9;流程图与日志类定义 流程图 日志类定义 &#x1f33c;功能实现 生成日志文件 && 判断写入方式 日志分级与分文件 &#x1f33c;整体思路 日志系统分两部…

Python:练习:输出int值a占b的百分之几。例如:输入1和4,输出:25%。

案例&#xff1a; 输出int值a占b的百分之几。例如&#xff1a;输入1和4&#xff0c;输出&#xff1a;25%。 思考&#xff1a; 所有的一步步思考&#xff0c;最后综合起来。 首先&#xff0c;确定 输出&#xff0c;那么就用input&#xff0c;而且是int值&#xff0c;所以肯定…

RK3568 android11 调试陀螺仪模块 MPU6500

一&#xff0c;MPU6500功能介绍 1.简介 MPU6500是一款由TDK生产的运动/惯性传感器&#xff0c;属于惯性测量设备&#xff08;IMU&#xff09;的一种。MPU6500集成了3轴加速度计、3轴陀螺仪和一个板载数字运动处理器&#xff08;DMP&#xff09;&#xff0c;能够提供6轴的运动…