二刷LeetCode--146.LRU缓存(C++版本),必会题目

这篇具有很好参考价值的文章主要介绍了二刷LeetCode--146.LRU缓存(C++版本),必会题目。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

本题思路:因为需要记录元素的出入顺序,并且每次访问之后需要将该节点提到最前面,因此需要使用双向链表(单链表不方便删除操作),而为了可以在常量时间复杂度内找到对应的元素,我们需要使用哈希表,将每一个插入的元素在哈希表中进行记录.哈希表的key就是插入的key,而哈希表的value应该对应的是双向链表的一个节点.注意:我们可能会想,既然使用哈希表,那么双链表中只需要存储value就可以,为什么还需要存储key呢.这个在执行最久未使用的节点删除的时候可以发现,如果双向链表中只是存储了value,那么删除的时候就不能将哈希表中的记录删除掉.文章来源地址https://www.toymoban.com/news/detail-647226.html

class LRUCache {
public:
    // 定义双向链表
    struct node 
    {
        int  key, value;
        struct node *left, *right;
        // k-v及左右指针的初始化
        node(int _key, int _value):key(_key), value(_value), left(NULL), right(NULL){}
    }*L, *R;
    // 定义链表容量以及哈希表
    int n;
    unordered_map<int, node*> hash;

    // 移除节点,移除的是最右端的节点,即尾节点(R)之前的那个
    void remove(node *p)
    {
        p -> right -> left = p -> left;
        p -> left -> right = p -> right;
    }

    // 新节点插入函数,在头节点(L)之后
    void insert(node *p)
    {
        p -> right = L -> right;
        p -> left = L;
        L -> right -> left = p;
        L -> right = p;
    }

    // 新被访问的节点放在最左边,最右端的节点就是待删除结点,使用哈希表记录元素是否出现
    LRUCache(int capacity) 
    {
        n = capacity;
        // 首尾节点初始化
        L = new node(-1, -1), R = new node(-1, -1);
        // 初始化之后链表指针赋值
        L -> right = R;
        R -> left = L;
    }
    
    int get(int key) 
    {
        // 检查哈希表中该元素出现的次数
        if(hash.count(key) == 0)
            return -1;
        // 如果出现过,那么就把该元素插入到头部,并且删除该节点
        // 哈希表的value存的是节点(结构体指针类型)
        struct node *p = hash[key];
        remove(p);
        insert(p);
        return p -> value;
    }
    
    void put(int key, int value) 
    {
        // 如果key存在,那么只需要修改value即可
        if(hash.count(key) != 0)
        {
            auto p = hash[key];
            // struct node *p = hash[key];
            p -> value = value;
            // 每访问一次就需要重新删除重新插入到头部
            remove(p);
            insert(p);
        }
        else
        {
            // 首先判断是不是到达容量上限
            if(hash.size() == n)
            {
                // 删除最右边的数据节点
                struct node *p = R -> left;
                remove(p);
                // 更新哈希表
                hash.erase(p -> key);
                delete p;
            }
            // 否则就直接插入新节点即可
            struct node *p = new node(key, value);
            insert(p);
            hash[key] = p;
        }
    }
};

/**
 * 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);
 */

到了这里,关于二刷LeetCode--146.LRU缓存(C++版本),必会题目的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • leetcode做题笔记146. LRU 缓存

    请你设计并实现一个满足  LRU (最近最少使用) 缓存 约束的数据结构。 实现  LRUCache  类: LRUCache(int capacity)  以  正整数  作为容量  capacity  初始化 LRU 缓存 int get(int key)  如果  key  存在于缓存中,则返回的值,否则返回  -1  。 void put(int key, int value)  如果

    2024年02月07日
    浏览(37)
  • Leetcode 146. LRU 缓存(Hashmap+双链表)

    请你设计并实现一个满足 LRU (最近最少使用) 缓存 约束的数据结构。 实现 LRUCache 类: ● LRUCache(int capacity) 以 正整数 作为容量 capacity 初始化 LRU 缓存 ● int get(int key) 如果 key 存在于缓存中,则返回的值,否则返回 -1 。 ● void put(int key, int value) 如果 key 已

    2024年02月16日
    浏览(47)
  • 【数据结构】LRU缓存的简单模拟实现(leetcode力扣146LRU缓存)

    LRU是Least Recently Used的缩写,意思是最近最少使用,它是一种Cache替换算法。 Cache的容量有限,因此当Cache的容量用完后,而又有新的内容需要添加进来时, 就需要挑选并舍弃原有的部分内容,从而腾出空间来放新内容。LRU Cache 的替换原则就是将最近最少使用的内容替换掉。

    2024年02月03日
    浏览(43)
  • [力扣146. LRU 缓存 ](https://leetcode.cn/problems/lru-cache/description/)

    力扣146. LRU 缓存 使用LinkedHashmap(HashMap的子类,能够记住插入数据的顺序). LRU是Lease Recently User的缩写,意思是最近 最少使用。比如设计一个文件缓存系统,每个文件有自己的大小和访问时间,文件缓存系统有总的大小,当往这个文件系统中放入新的文件时,如果发现超出文件

    2024年02月11日
    浏览(51)
  • 每日两题 / 142. 环形链表 II & 146. LRU 缓存(LeetCode热题100)

    142. 环形链表 II - 力扣(LeetCode) 用哈希记录走过的节点即可 146. LRU 缓存 - 力扣(LeetCode) O ( 1 ) O(1) O ( 1 ) 地查找并修改kv结构,用unordered_map即可解决 问题是题目要求:哈希表容量有限,超出容量时,将删除最久未访问的kv 那么关键就在于:如何用数据结构表示访问的先后顺

    2024年04月16日
    浏览(41)
  • 146. LRU 缓存

    请你设计并实现一个满足 LRU (最近最少使用) 缓存 约束的数据结构。 实现 LRUCache 类: LRUCache(int capacity) 以 正整数 作为容量 capacity 初始化 LRU 缓存 int get(int key) 如果 key 存在于缓存中,则返回的值,否则返回 -1 。 void put(int key, int value) 如果 key 已经存在,

    2024年02月12日
    浏览(46)
  • LeetCode刷题---LRU缓存

    LRU是Least Recently Used的缩写,即最近最少使用,是一种内存管理算法,也可以用作缓存淘汰策略。 这种算法的核心思想是:如果数据最近被访问过,那么将来被访问的几率也更高。 因此,当内存或缓存容量有限,需要淘汰部分数据时,LRU算法会优先淘汰那些最长时间未被访问

    2024年02月22日
    浏览(37)
  • (力扣记录)146. LRU 缓存

    数据类型 :链表 时间复杂度: O(1) 空间复杂度: O(N) 代码实现:

    2024年01月18日
    浏览(41)
  • 二刷LeetCode--48. 旋转图像(C++版本),数学题

    思路:主要是观察变化之后的数组和最开始的数组的区别,不难发现,先转置在左右镜像对称即可。需要注意的是转置和镜像对称中for变量的终止条件。

    2024年02月12日
    浏览(39)
  • 【leetcode100-035】【链表/哈希链表】LRU缓存

    【题干】 请你设计并实现一个满足  LRU (最近最少使用) 缓存 约束的数据结构。 实现  LRUCache  类: LRUCache(int capacity)  以  正整数  作为容量  capacity  初始化 LRU 缓存 int get(int key)  如果  key  存在于缓存中,则返回的值,否则返回  -1  。 void put(int key, in

    2024年02月01日
    浏览(43)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包