146. LRU 缓存机制

LeetCode-146

题目描述

题解分析

java代码

package com.walegarrett.interview;

/**
* @Author WaleGarrett
* @Date 2021/2/19 8:51
*/ import java.util.HashMap;
import java.util.Map; /**
* 题目描述:运用你所掌握的数据结构,设计和实现一个  LRU (最近最少使用) 缓存机制 。
* 实现 LRUCache 类:
* LRUCache(int capacity) 以正整数作为容量 capacity 初始化 LRU 缓存
* int get(int key) 如果关键字 key 存在于缓存中,则返回关键字的值,否则返回 -1 。
* void put(int key, int value) 如果关键字已经存在,则变更其数据值;如果关键字不存在,则插入该组「关键字-值」。
* 当缓存容量达到上限时,它应该在写入新数据之前删除最久未使用的数据值,从而为新的数据值留出空间。
*  
* 进阶:你是否可以在 O(1) 时间复杂度内完成这两种操作?
*/
public class LeetCode_146 {
private DLinkedNode head,tail;//伪头结点和尾结点
private int size,capacity;
private Map<Integer,DLinkedNode> map = new HashMap<>();
public LeetCode_146(int capacity) {
this.size = 0;
this.capacity = capacity;
//创建伪头结点和伪尾结点
head = new DLinkedNode();
tail = new DLinkedNode();
head.next = tail;
tail.pre = head;
} public int get(int key) {
DLinkedNode node = map.get(key);
if(node == null)
return -1;
//如果key存在,因为这是最新使用的将其移动到头结点
removeToHead(node);
return node.value;
} public void put(int key, int value) {
DLinkedNode node = map.get(key);
if(node == null){
//如果key不存在,则创建一个新的结点
DLinkedNode newNode = new DLinkedNode(key, value);
map.put(key, newNode);
//添加到链表头部
addToHead(newNode);
++size;
//判断个数是否超出容量
if(size>capacity){
//删除尾部结点
DLinkedNode tail = removeTail();
//删除哈希表中对应的项
map.remove(tail.key);
--size;
}
}else{
//如果key存在,首先更新哈希表中的value
node.value = value;
map.put(key, node);
//该结点为最近访问的结点,添加到头结点
removeToHead(node);
}
}
/**
* 双向链表的自定义实现
*/
class DLinkedNode{
int key,value;
DLinkedNode pre,next;
public DLinkedNode(){}
public DLinkedNode(int _key, int _value){key = _key; value=_value;}
} /**
* 将新结点放置到头结点
* @param node
*/
private void addToHead(DLinkedNode node){
node.pre = head;
node.next = head.next;
head.next.pre = node;
head.next = node;
} /**
* 移除当前结点
* @param node
*/
private void removeNode(DLinkedNode node){
node.pre.next = node.next;
node.next.pre = node.pre;
} /**
* 将当前结点移动到头结点
* @param node
*/
private void removeToHead(DLinkedNode node){
removeNode(node);
addToHead(node);
} /**
* 删除尾结点
*/
private DLinkedNode removeTail(){
DLinkedNode realTail = tail.pre;
removeNode(realTail);
return realTail;
}
}

复杂度分析

146. LRU 缓存机制 + 哈希表 + 自定义双向链表的更多相关文章

  1. 力扣 - 146. LRU缓存机制

    目录 题目 思路 代码 复杂度分析 题目 146. LRU缓存机制 思路 利用双链表和HashMap来解题 看到链表题目,我们可以使用头尾结点可以更好进行链表操作和边界判断等 还需要使用size变量来 ...

  2. 【golang必备算法】 Letecode 146. LRU 缓存机制

    力扣链接:146. LRU 缓存机制 思路:哈希表 + 双向链表 为什么必须要用双向链表? 因为我们需要删除操作.删除一个节点不光要得到该节点本身的指针,也需要操作其前驱节点的指针,而双向链表才能支持 ...

  3. Java实现 LeetCode 146 LRU缓存机制

    146. LRU缓存机制 运用你所掌握的数据结构,设计和实现一个 LRU (最近最少使用) 缓存机制.它应该支持以下操作: 获取数据 get 和 写入数据 put . 获取数据 get(key) - ...

  4. 【力扣】146. LRU缓存机制

    运用你所掌握的数据结构,设计和实现一个  LRU (最近最少使用) 缓存机制.它应该支持以下操作: 获取数据 get 和 写入数据 put . 获取数据 get(key) - 如果关键字 (key) ...

  5. [Leetcode]146.LRU缓存机制

    Leetcode难题,题目为: 运用你所掌握的数据结构,设计和实现一个  LRU (最近最少使用) 缓存机制.它应该支持以下操作: 获取数据 get 和 写入数据 put . 获取数据 get(key ...

  6. Leetcode 146. LRU 缓存机制

    前言 缓存是一种提高数据读取性能的技术,在计算机中cpu和主内存之间读取数据存在差异,CPU和主内存之间有CPU缓存,而且在内存和硬盘有内存缓存.当主存容量远大于CPU缓存,或磁盘容量远大于主存时,哪 ...

  7. 146. LRU缓存机制

    题目描述 运用你所掌握的数据结构,设计和实现一个LRU (最近最少使用) 缓存机制.它应该支持以下操作: 获取数据 get 和 写入数据 put . 获取数据 get(key) - 如果密钥 (key ...

  8. leetcode:146. LRU缓存机制

    题目描述: 运用你所掌握的数据结构,设计和实现一个  LRU (最近最少使用) 缓存机制.它应该支持以下操作: 获取数据 get 和 写入数据 put . 获取数据 get(key) - 如果密钥 ( ...

  9. LeetCode 146. LRU缓存机制(LRU Cache)

    题目描述 运用你所掌握的数据结构,设计和实现一个  LRU (最近最少使用) 缓存机制.它应该支持以下操作: 获取数据 get 和 写入数据 put . 获取数据 get(key) - 如果密钥 (k ...

随机推荐

  1. 【poj 2976】Dropping tests(算法效率--01分数规划 模版题+二分){附【转】01分数规划问题}

    P.S.又是一个抽时间学了2个小时的新东西......讲解在上半部分,题解在下半部分. 先说一下转的原文:http://www.cnblogs.com/perseawe/archive/2012/05 ...

  2. VJ train1 I-彼岸

    一道递推题(我这个菜鸡刚开始以为是排列组合) 题目: 突破蝙蝠的包围,yifenfei来到一处悬崖面前,悬崖彼岸就是前进的方向,好在现在的yifenfei已经学过御剑术,可御剑轻松飞过悬崖.现在的问题 ...

  3. IFIX 目录结构

    iFIX使用了许多目录存储程序和数据文件.用路径配置对话框来指定iFIX目录的位置和名称.可在SCU工具箱中单击"路径"按钮显示该对话框. 当iFIX安装后它将创建一个目录,该目录 ...

  4. DuckDuckGo Privacy Browse‪r‬

    DuckDuckGo Privacy Browser https://apps.apple.com/app/duckduckgo-privacy-browser/id663592361 https:/ ...

  5. 树莓派 4B 入门教程

    树莓派 4B 入门教程 Raspberry Pi, Raspberry Pi 3B, Raspberry Pi 4B 树莓派 4B 入门手册 PDF Raspberry Pi Beginners Gu ...

  6. array group by key javascript

    array group by key javascript calendar Array.reduce https://developer.mozilla.org/en-US/docs/Web/Jav ...

  7. windwos创建和删除服务

    创建 >sc create <service name> type=kernel binpath="C:\hsys.sys" 删除 win+r 输出 regedi ...

  8. privacy policy 隐私政策

    privacy policy 隐私政策 privacy agreement css layout & ssr page flex & center & fonts demo h ...

  9. react 异步的setState

    import React from "react"; class App extends React.Component { state = { a: 0 }; component ...

  10. NGK生态所即将启程!助力NGK公链建立全方位区块链生态系统!

    据NGK官方消息,NGK生态所将暂定于2月15日正式上线.据了解,这是全球首个基于公链打造的生态所,也是NGK生态重要的应用之一. 此前,NGK灵石团队CTO通过多方媒体透露,NGK生态所采用去中心化 ...