Leetcode|146. LRU 缓存机制(key2node哈希链表)

2024-01-10 03:48

本文主要是介绍Leetcode|146. LRU 缓存机制(key2node哈希链表),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

在这里插入图片描述

相关题目

《Leetcode|146. LRU 缓存机制(key2node哈希链表)》
《Leetcode|460. LFU 缓存(KV+KF+FK哈希链表+minFreq)》

解题过程

在这里插入图片描述
其实这里只要1个哈希链表足矣,代码不难,但一次写对不易

  • 注意删除链表节点时,对应也要删除哈希表中的KV
  • 添加链表节点时,也要在哈希表中添加KV
struct DListNode {int key, val;DListNode* prev;DListNode* next;DListNode(): key(0), val(0), prev(nullptr), next(nullptr) {}DListNode(int _key, int _val): key(_key), val(_val), prev(nullptr), next(nullptr) {} 
};class LRUCache {
private:int size, capacity;DListNode* head;DListNode* tail;unordered_map<int, DListNode*> key2node;
public:LRUCache(int _capacity): capacity(_capacity), size(0) {head = new DListNode();tail = new DListNode();head->next = tail;tail->prev = head;}int get(int key) {if (key2node.count(key)) {makeRecent(key);return key2node[key]->val;}return -1;}void put(int key, int value) {if (key2node.count(key)) {key2node[key]->val = value;makeRecent(key);return;}if (capacity == size)removeLongestKey();addRecentKey(key, value);}void makeRecent(int key) {// 取出待提升优先级key对应的nodeauto node = key2node[key];// 在双链表中删除该节点node->prev->next = node->next;node->next->prev = node->prev;// 将该节点插入到双链表中尾部node->prev = tail->prev;node->next = tail;tail->prev->next = node;tail->prev = node;}void removeLongestKey() {// 删除哈希表对应KVkey2node.erase(head->next->key);// 删除双链表对应KVauto deletenode = head->next;deletenode->next->prev = head;head->next = deletenode->next; size--;}void addRecentKey(int key, int value) {auto node = new DListNode(key, value);// 更新双链表node->prev = tail->prev;node->next = tail;tail->prev->next = node;tail->prev = node;// 更新哈希表key2node[key] = node;size++;}
};/**int main() {LRUCache lru(2);lru.put(1, 1);lru.put(2, 2);cout << lru.get(1) << endl;lru.put(3, 3);cout << lru.get(2) << endl;lru.put(4, 4);cout << lru.get(1) << endl;cout << lru.get(3) << endl;cout << lru.get(4) << endl;return 0;
}*/

在这里插入图片描述

致谢

图片来源于「labuladong」公众号,欢迎大家关注这位大佬的公号

这篇关于Leetcode|146. LRU 缓存机制(key2node哈希链表)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/589444

相关文章

JVM 的类初始化机制

前言 当你在 Java 程序中new对象时,有没有考虑过 JVM 是如何把静态的字节码(byte code)转化为运行时对象的呢,这个问题看似简单,但清楚的同学相信也不会太多,这篇文章首先介绍 JVM 类初始化的机制,然后给出几个易出错的实例来分析,帮助大家更好理解这个知识点。 JVM 将字节码转化为运行时对象分为三个阶段,分别是:loading 、Linking、initialization

哈希leetcode-1

目录 1前言 2.例题  2.1两数之和 2.2判断是否互为字符重排 2.3存在重复元素1 2.4存在重复元素2 2.5字母异位词分组 1前言 哈希表主要是适合于快速查找某个元素(O(1)) 当我们要频繁的查找某个元素,第一哈希表O(1),第二,二分O(log n) 一般可以分为语言自带的容器哈希和用数组模拟的简易哈希。 最简单的比如数组模拟字符存储,只要开26个c

csu1329(双向链表)

题意:给n个盒子,编号为1到n,四个操作:1、将x盒子移到y的左边;2、将x盒子移到y的右边;3、交换x和y盒子的位置;4、将所有的盒子反过来放。 思路分析:用双向链表解决。每个操作的时间复杂度为O(1),用数组来模拟链表,下面的代码是参考刘老师的标程写的。 代码如下: #include<iostream>#include<algorithm>#include<stdio.h>#

usaco 1.3 Prime Cryptarithm(简单哈希表暴搜剪枝)

思路: 1. 用一个 hash[ ] 数组存放输入的数字,令 hash[ tmp ]=1 。 2. 一个自定义函数 check( ) ,检查各位是否为输入的数字。 3. 暴搜。第一行数从 100到999,第二行数从 10到99。 4. 剪枝。 代码: /*ID: who jayLANG: C++TASK: crypt1*/#include<stdio.h>bool h

缓存雪崩问题

缓存雪崩是缓存中大量key失效后当高并发到来时导致大量请求到数据库,瞬间耗尽数据库资源,导致数据库无法使用。 解决方案: 1、使用锁进行控制 2、对同一类型信息的key设置不同的过期时间 3、缓存预热 1. 什么是缓存雪崩 缓存雪崩是指在短时间内,大量缓存数据同时失效,导致所有请求直接涌向数据库,瞬间增加数据库的负载压力,可能导致数据库性能下降甚至崩溃。这种情况往往发生在缓存中大量 k

Java ArrayList扩容机制 (源码解读)

结论:初始长度为10,若所需长度小于1.5倍原长度,则按照1.5倍扩容。若不够用则按照所需长度扩容。 一. 明确类内部重要变量含义         1:数组默认长度         2:这是一个共享的空数组实例,用于明确创建长度为0时的ArrayList ,比如通过 new ArrayList<>(0),ArrayList 内部的数组 elementData 会指向这个 EMPTY_EL

深入手撕链表

链表 分类概念单链表增尾插头插插入 删尾删头删删除 查完整实现带头不带头 双向链表初始化增尾插头插插入 删查完整代码 数组 分类 #mermaid-svg-qKD178fTiiaYeKjl {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-

【编程底层思考】垃圾收集机制,GC算法,垃圾收集器类型概述

Java的垃圾收集(Garbage Collection,GC)机制是Java语言的一大特色,它负责自动管理内存的回收,释放不再使用的对象所占用的内存。以下是对Java垃圾收集机制的详细介绍: 一、垃圾收集机制概述: 对象存活判断:垃圾收集器定期检查堆内存中的对象,判断哪些对象是“垃圾”,即不再被任何引用链直接或间接引用的对象。内存回收:将判断为垃圾的对象占用的内存进行回收,以便重新使用。

leetcode-24Swap Nodes in Pairs

带头结点。 /*** Definition for singly-linked list.* public class ListNode {* int val;* ListNode next;* ListNode(int x) { val = x; }* }*/public class Solution {public ListNode swapPairs(L

leetcode-23Merge k Sorted Lists

带头结点。 /*** Definition for singly-linked list.* public class ListNode {* int val;* ListNode next;* ListNode(int x) { val = x; }* }*/public class Solution {public ListNode mergeKLists