LRU 力扣 146 https://leetcode.cn/problems/lru-cache/
一道经典题目,用双向链表去做能够满足O1的复杂度
核心代码如下
class LRUCache {
MyLinkedList myLinkedList;
int size;
int capacity;
HashMap<Integer, MyNode> map;
public LRUCache(int capacity) {
myLinkedList=new MyLinkedList();
this.capacity=capacity;
size=0;
map=new HashMap<>();
}
public int get(int key) {
if (!map.containsKey(key)){
return -1;
}
// 拿出来 放到顶部
MyNode current = map.get(key);
myLinkedList.deleteAndAddFirst(current);
return current.val;
}
public void put(int key, int value) {
if (map.containsKey(key)){
// 老人了
MyNode current = map.get(key);
current.val=value;
myLinkedList.deleteAndAddFirst(current);
map.put(key,current);
}else {
if (size<capacity){
// 直接放进来就行
MyNode temp = new MyNode(key, value);
myLinkedList.add(temp);
map.put(key,temp);
size++;
}else {
// 踢人了
MyNode myNode = myLinkedList.removeLast();
map.remove(myNode.key);
// 再放进
MyNode temp = new MyNode(key, value);
myLinkedList.add(temp);
map.put(key,temp);
}
}
}
}
class MyLinkedList{
MyNode head;
MyNode tail;
public MyLinkedList() {
head=new MyNode(-1,-1);
tail=new MyNode(-1,-1);
head.next=tail;
tail.pre=head;
}
/**
* 把之前的放到新的位置
* @param current
*/
public void deleteAndAddFirst(MyNode current){
//去除之前的位置
MyNode next = current.next;
MyNode pre = current.pre;
pre.next=next;
next.pre=pre;
add(current);
}
public void add(MyNode current){
MyNode old = head.next;
current.next=old;
head.next=current;
old.pre=current;
current.pre=head;
}
public MyNode removeLast(){
MyNode last = tail.pre;
MyNode pre= last.pre;
pre.next=tail;
tail.pre=pre;
return last;
}
}
class MyNode{
Integer key;
Integer val;
MyNode next;
MyNode pre;
public MyNode(Integer key, Integer val) {
this.key = key;
this.val = val;
}
}
题解
LRU 力扣 146 https://leetcode.cn/problems/lru-cache/的更多相关文章
- 力扣 - 146. LRU缓存机制
目录 题目 思路 代码 复杂度分析 题目 146. LRU缓存机制 思路 利用双链表和HashMap来解题 看到链表题目,我们可以使用头尾结点可以更好进行链表操作和边界判断等 还需要使用size变量来 ...
- https://leetcode.com/problems/palindromic-substrings/description/
https://www.cnblogs.com/grandyang/p/7404777.html 博客中写的<=2,实际上<=1也是可以的 相当于判断一个大指针内所有子字符串是否可能为回文 ...
- 力扣---1148. 文章浏览 I
Views 表:+---------------+---------+| Column Name | Type |+---------------+---------+| article_i ...
- 力扣---2319. 判断矩阵是否是一个 X 矩阵
如果一个正方形矩阵满足下述 全部 条件,则称之为一个 X 矩阵 : 矩阵对角线上的所有元素都 不是 0 矩阵中所有其他元素都是 0给你一个大小为 n x n 的二维整数数组 grid ,表 ...
- 力扣---167. 两数之和 II - 输入有序数组
给你一个下标从 1 开始的整数数组 numbers ,该数组已按 非递减顺序排列 ,请你从数组中找出满足相加之和等于目标数 target 的两个数.如果设这两个数分别是 numbers[index1 ...
- 力扣---511. 游戏玩法分析 I
活动表 Activity: +--------------+---------+| Column Name | Type |+--------------+---------+| player ...
- 力扣每日一题2023.1.19---2299. 强密码检验器 II
如果一个密码满足以下所有条件,我们称它是一个 强 密码: 它有至少 8 个字符. 至少包含 一个小写英文 字母. 至少包含 一个大写英文 字母. 至少包含 一个数字 . ...
- 力扣每日一题2023.1.16---1813. 句子相似性 III
一个句子是由一些单词与它们之间的单个空格组成,且句子的开头和结尾没有多余空格.比方说,"Hello World" ,"HELLO" ,"hello w ...
- 力扣---45. 跳跃游戏 II
给定一个长度为 n 的 0 索引整数数组 nums.初始位置为 nums[0].每个元素 nums[i] 表示从索引 i 向前跳转的最大长度.换句话说,如果你在 nums[i] 处,你可以跳转到任意 ...
- 力扣---213. 打家劫舍 II
你是一个专业的小偷,计划偷窃沿街的房屋,每间房内都藏有一定的现金.这个地方所有的房屋都 围成一圈 ,这意味着第一个房屋和最后一个房屋是紧挨着的.同时,相邻的房屋装有相互连通的防盗系统,如果两间相邻的房 ...
随机推荐
- 颜值即正义,献礼就业季,打造多颜色多字体双飞翼布局技术简历模版(Resume)
一年好景君须记,最是橙黄橘绿时.金三银四,秣马厉兵,没有一个好看的简历模板怎么行?无论是网上随便下载还是花钱买,都是一律千篇的老式模版,平平无奇,味同嚼蜡,没错,蜡都要沿着嘴角流下来了.本次我们基于H ...
- Kubernetes入门实践(环境搭建)
容器技术只是解决了运维部署工作中的一个很小的问题,在现实生产环境中,除了最基本的安装,还会各式各样的需求,比如服务发现.负载均衡.状态监控.健康检查.扩容缩容.应用迁移.高可用等等.这些容器之上的管理 ...
- vue移动端预览 pdf 文件
pdf预览,在项目中是很常见的需求,在PC端web项目中,我们可以使用window.open(url)直接打开pdf进行预览,那么移动端虽然我们也可以使用此方法,但是这是新开了一个webview页面, ...
- 推荐一个基于.Net Framework开发的Windows右键菜单管理工具
平常在我们电脑,我们都会安装非常多的软件,很多软件默认都会向系统注册右键菜单功能,这样方便我们快捷打开.比如图片文件,通过右键的方式,快捷选择PS软件打开. 如果我们电脑安装非常多的软件,就会导致我们 ...
- abp(net core)+easyui+efcore实现仓储管理系统——供应商管理升级之上(六十三)
abp(net core)+easyui+efcore实现仓储管理系统目录 abp(net core)+easyui+efcore实现仓储管理系统--ABP总体介绍(一) abp(net core)+ ...
- 2023-02-18:ffmpeg是c编写的音视频编解码库,请问用go语言如何调用?例子是03输出版本号。
2023-02-18:ffmpeg是c编写的音视频编解码库,请问用go语言如何调用?例子是03输出版本号. 答案2023-02-18: 用 github.com/moonfdd/ffmpeg-go 这 ...
- 2021-01-10:linux中,我要看某一个进程的并发,通过什么命令去查?
福哥答案2021-01-10:[答案来自此链接:](https://blog.csdn.net/sinat_31275315/article/details/108239492)方法一:PS在ps命令 ...
- 2021-05-20:给定一个数组arr, 返回如果排序之后,相邻两数的最大差值。要求:时间复杂度O(N) 。
2021-05-20:给定一个数组arr, 返回如果排序之后,相邻两数的最大差值.要求:时间复杂度O(N) . 福大大 答案2021-05-20: 假设答案法.N个数,根据最大值和最小值的范围等分成N ...
- reverse逆转,即反向排序
reverse逆转,即反向排序 print(Student.objects.all().exclude(nickname='A').reverse()
- 【工作随手记】deaklock排查
生产环境当中还没真正遇到过死锁的问题.有些疑似死锁的问题,后来经过排查也只是其它问题导致的.所以通过jstack到底怎样排查死锁问题有点疏忽了.这里作个记录. 模拟一个死锁 顺便复习一下. 死锁的产生 ...