当前位置: 首页 > Web前端 > HTML

146.LRU缓存-算法(leetcode,附思维导图+全解)300题

时间:2023-03-28 19:22:38 HTML

零题:算法(leetcode,附思维导图+全解)300题(146)LRU缓存1题目描述2解概览(思维导图)三全解1方案11)代码://方案1“Self.Hash”。//提示:遇到O(1)的get和put操作时,优先考虑哈希表(JS中的Map数据结构)。/***@param{number}容量*/varLRUCache=function(capacity){this.capacity=capacity;这个.curCapacity=0;//注意:最近使用的键越多,它越会放在地图的后面!this.map=newMap();};/***@param{number}key*@return{number}*/LRUCache.prototype.get=function(key){const{map}=this;让resVal=-1;//边界1:get操作,如果key已经存在,//先删除key,然后把key放在map的末尾——说明key最近被使用过!如果(map.has(key)){resVal=map.get(key);地图.删除(键);map.set(key,resVal);}returnresVal;};/***@param{number}key*@param{number}value*@return{void}*/LRUCache.prototype.put=function(key,value){const{capacity,curCapacity,地图}=这个;//边界2:put操作,如果已经有这样的key的话,//先删除key,然后把key放到map的末尾——说明这个key最近被使用过!if(map.has(key)){map.delete(key);地图集(键,值);返回;}//边界3:put操作,如果当前无法容纳(即curCapacity>=capacity),//则删除map的第一个key,将新的key放在map-table的末尾表示该密钥最近被使用过!if(curCapacity>=capacity){for(const[key,val]ofmap){map.delete(key);休息;}map.set(key,value);}//边界4:put操作,如果current可以放下(即curCapacitythis.capacity){this.removeLRUItem();}}else{//节点存在,更新其值并将节点移至头部node.value=value;这个.moveToHead(节点);}}moveToHead(node){//从链表中移除该节点,并将该节点添加到头节点this.removeFromList(node);this.addToHead(节点);}//节点删除(本质:改变指针指向)removeFromList(node){letnodePre=node.prev,nodeNext=node.next;nodePre.next=nodeNext;nodeNext.prev=nodePre;}//加入链表头部的节点指针addToHead(node){const{dummyHead=null}=this,dummyHeadNext=dummyHead.next;node.prev=dummyHead;节点.next=dummyHeadNext;dummyHeadNext.prev=节点;dummyHead.next=节点;//注意:上面4行代码相当于下面1行(JS语法糖)//[node.prev,node.next,dummyHeadNext.prev,dummyHead.next]=[dummyHead,dummyHeadNext,node,node];}removeLRUItem(){const{dummyTail=null,map=newMap()}=this,tailNode=dummyTail.prev;//移除尾节点并更新容量(即curCapacity)信息this.removeFromList(tailNode);map.delete(tailNode.key);这个.curCapacity--;}}四资源共享及更多1历史文章-概述2博主简介致力于编写极简但完整的问题解决方案(算法)的博主专注于一个问题,具有多种解决方案和结构化思维。欢迎大家一起刷LeetCode~