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

leetcode 146.LRU缓存

思路一:哈希表模拟

如果只用哈希表进行模拟的话,需要开辟两个哈希表进行存储,一个装入数据,一个是记录数据key放入的次数。

然后,可以结合操作系统中最近最久算法的那个实例操作进行模拟,但是时间复杂度会O(n),因此并不是这道题的最优解,并且会因为时间限制通过不了,可以通过这个模拟方法复习操作系统,并且提升代码能力。

class LRUCache {int volumn;Map<Integer,Integer>map;Map<Integer,Integer>count;int cnt=0;public LRUCache(int capacity) {this.volumn=capacity;map=new HashMap<>();count=new HashMap<>();}public int get(int key) {if(map.containsKey(key)){Set set=count.keySet();Iterator it=set.iterator();while(it.hasNext()){Integer tmp=(Integer)it.next();count.put(tmp,count.get(tmp)+1);}count.put(key,1);return map.get(key);}elsereturn -1;}public void put(int key, int value) {if(!map.containsKey(key)){cnt++;}if(cnt>volumn&&!map.containsKey(key)){cnt--;Set set=count.keySet();Iterator it=set.iterator();int maxs=0;while(it.hasNext()){Integer tmp=(Integer)it.next();maxs=Math.max(maxs,count.get(tmp));}Set set1=count.keySet();Iterator its=set1.iterator();while(its.hasNext()){Integer tmp=(Integer)its.next();if(count.get(tmp)==maxs){map.remove(tmp);count.remove(tmp);break;}}Set sets=count.keySet();Iterator itw=sets.iterator();while(itw.hasNext()){Integer tmp=(Integer)itw.next();count.put(tmp,count.get(tmp)+1);}map.put(key,value);count.put(key,1);}else{Set set1=count.keySet();Iterator it=set1.iterator();while(it.hasNext()){Integer tmp=(Integer)it.next();count.put(tmp,count.get(tmp)+1);}count.put(key,1);map.put(key,value);}}
}/*** 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);*/

思路二:用双向链表,哈希表作为辅助。

这个过程有点像自己在一堆书里拿书,就是灵神的那个题解思想,这里直接上代码。

注意事项:在写remove函数的时候,可能会出现空指针的异常,这是因为传入的参数可能是一个null,所以为了避免这种事情发生,我们要么就在函数前面加上声明特判null,要么就需要保证传入的结点必须是非null的,这样的话就需要对其他相关的函数进行约束。

class LRUCache {private final int capacity;private class Node{Node pre;Node next;int key,value;public Node(int key,int value){this.key=key;this.value=value;}}private final Node dummy=new Node(0,0);private Map<Integer,Node>map=new HashMap<>();public LRUCache(int capacity) {this.capacity=capacity;dummy.next=dummy;dummy.pre=dummy;}public int get(int key) {Node t=getNode(key);return t!=null?t.value:-1;}public void put(int key, int value) {Node node=getNode(key);if(node!=null){node.value=value;return;}node=new Node(key,value);map.put(key,node);pullFront(node);if(map.size()>capacity){Node tmp=dummy.pre;remove(tmp);map.remove(tmp.key);}}public Node getNode(int key){if(!map.containsKey(key)){return null;}Node tmp=map.get(key);remove(tmp);pullFront(tmp);return tmp;}public void remove(Node tmp){tmp.pre.next=tmp.next;tmp.next.pre=tmp.pre;}public void pullFront(Node tmp){tmp.pre=dummy;tmp.next=dummy.next;tmp.pre.next=tmp;tmp.next.pre=tmp;}
}/*** 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);*/

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • Encountered error while trying to install package.> lxml
  • VS Code 配置 Rust-Analyzer 报错
  • web渗透—RCE
  • SQL Server 语句日期格式查找方法
  • HT338 2x50W D类立体声音频功放
  • Android 测试机
  • 基于微信小程序的图书馆预约占座系统
  • 计算机毕业设计 自习室座位预约系统的设计与实现 Java+SpringBoot+Vue 前后端分离 文档报告 代码讲解 安装调试
  • 【鸿蒙HarmonyOS NEXT】页面之间相互传递参数
  • 复旦:EoT下Muti-agentllm曾带给我的启发
  • 【pytorch】【onnx部署】系列学习文章目录
  • apache文件共享和访问控制
  • 爱普生相机SD卡格式化后数据恢复指南
  • (不用互三)AI绘画:科技赋能艺术的崭新时代
  • QT核心机制
  • Akka系列(七):Actor持久化之Akka persistence
  • Android开发 - 掌握ConstraintLayout(四)创建基本约束
  • C++入门教程(10):for 语句
  • Computed property XXX was assigned to but it has no setter
  • Java 11 发布计划来了,已确定 3个 新特性!!
  • JavaScript 无符号位移运算符 三个大于号 的使用方法
  • JavaScript服务器推送技术之 WebSocket
  • JS实现简单的MVC模式开发小游戏
  • node学习系列之简单文件上传
  • NSTimer学习笔记
  • socket.io+express实现聊天室的思考(三)
  • windows下mongoDB的环境配置
  • 服务器从安装到部署全过程(二)
  • 可能是历史上最全的CC0版权可以免费商用的图片网站
  • 如何进阶一名有竞争力的程序员?
  • 树莓派 - 使用须知
  • 用简单代码看卷积组块发展
  • 责任链模式的两种实现
  • 新年再起“裁员潮”,“钢铁侠”马斯克要一举裁掉SpaceX 600余名员工 ...
  • 支付宝花15年解决的这个问题,顶得上做出十个支付宝 ...
  • ​2021半年盘点,不想你错过的重磅新书
  • ​Z时代时尚SUV新宠:起亚赛图斯值不值得年轻人买?
  • !! 2.对十份论文和报告中的关于OpenCV和Android NDK开发的总结
  • # include “ “ 和 # include < >两者的区别
  • #1015 : KMP算法
  • (2)STL算法之元素计数
  • (ibm)Java 语言的 XPath API
  • (MATLAB)第五章-矩阵运算
  • (待修改)PyG安装步骤
  • (二刷)代码随想录第15天|层序遍历 226.翻转二叉树 101.对称二叉树2
  • (黑马C++)L06 重载与继承
  • (教学思路 C#之类三)方法参数类型(ref、out、parmas)
  • (三)模仿学习-Action数据的模仿
  • (原創) 未来三学期想要修的课 (日記)
  • (中等) HDU 4370 0 or 1,建模+Dijkstra。
  • (转) RFS+AutoItLibrary测试web对话框
  • (转)3D模板阴影原理
  • **python多态
  • .bat批处理(二):%0 %1——给批处理脚本传递参数
  • .NET Framework 的 bug?try-catch-when 中如果 when 语句抛出异常,程序将彻底崩溃