Grind 75 - Leetcode146 LRU缓存

打印 上一主题 下一主题

主题 571|帖子 571|积分 1713

Leetcode146 LRU缓存

经典题,典型compund data structure思想
link
思绪


  • 主要思想就是hash table + double-linked list
  • 重点就是手动实现这些功能
  • 因为get和put都要求                                        O                            (                            1                            )                                  O(1)                     O(1)时间内实现,所以就是要用hash table
  • 而要实现LRU,所以用双向链表维护近来使用
   ps: code 多打几遍就认识了
  1. class Node {
  2. public:
  3.     int key;
  4.     int value;
  5.     Node *last, *next;
  6.     Node(int k = 0, int val = 0) : key(k), value(val), last(nullptr), next(nullptr) {}
  7. };
  8. class LRUCache {
  9. private:
  10.     unordered_map<int, Node*> cache;
  11.     int size;
  12.     int capacity;
  13.     Node *head;
  14.     Node *tail;
  15.     void addNode(Node *node) {
  16.         node->next = head->next;
  17.         head->next->last = node;
  18.         node->last = head;
  19.         head->next = node;
  20.     }
  21.     void deleteNode(Node *node) {
  22.         node->last->next = node->next;
  23.         node->next->last = node->last;
  24.     }
  25.     void move(Node *node) {
  26.         deleteNode(node);
  27.         addNode(node);
  28.     }
  29.     Node *deleteTail() {
  30.         Node *node = tail->last;
  31.         deleteNode(node);
  32.         return node;
  33.     }
  34. public:
  35.     LRUCache(int capacity) : capacity(capacity), size(0) {
  36.         head = new Node();
  37.         tail = new Node();
  38.         head->next = tail;
  39.         tail->last = head;
  40.     }
  41.    
  42.     int get(int key) {
  43.         if (cache.count(key) == 0)
  44.             return -1;
  45.         Node *node = cache[key];
  46.         move(node);
  47.         return node->value;
  48.     }
  49.    
  50.     void put(int key, int value) {
  51.         if (cache.count(key) > 0) {
  52.             Node *node = cache[key];
  53.             node->value = value;
  54.             move(node);
  55.         }
  56.         else {
  57.             Node *node = new Node(key, value);
  58.             cache[key] = node;
  59.             addNode(node);
  60.             ++size;
  61.             if (size > capacity) {
  62.                 Node *lastUsed = deleteTail();
  63.                 cache.erase(lastUsed->key);
  64.                 --size;
  65.                 delete lastUsed;
  66.             }
  67.         }
  68.     }
  69. };
复制代码
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

傲渊山岳

金牌会员
这个人很懒什么都没写!

标签云

快速回复 返回顶部 返回列表