您的位置:首页 > 游戏 > 游戏 > Grind 75 - Leetcode146 LRU缓存

Grind 75 - Leetcode146 LRU缓存

2025/2/14 6:31:50 来源:https://blog.csdn.net/imlxinyu/article/details/136522888  浏览:    关键词:Grind 75 - Leetcode146 LRU缓存

Leetcode146 LRU缓存

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

  • 主要思想就是hash table + double-linked list
  • 重点就是手动实现这些功能
  • 因为getput都要求 O ( 1 ) O(1) O(1)时间内实现,所以就是要用hash table
  • 而要实现LRU,所以用双向链表维护最近使用

ps: code 多打几遍就熟悉了

class Node {
public:int key;int value;Node *last, *next;Node(int k = 0, int val = 0) : key(k), value(val), last(nullptr), next(nullptr) {}
};class LRUCache {
private:unordered_map<int, Node*> cache;int size;int capacity;Node *head;Node *tail;void addNode(Node *node) {node->next = head->next;head->next->last = node;node->last = head;head->next = node;}void deleteNode(Node *node) {node->last->next = node->next;node->next->last = node->last;}void move(Node *node) {deleteNode(node);addNode(node);}Node *deleteTail() {Node *node = tail->last;deleteNode(node);return node;}public:LRUCache(int capacity) : capacity(capacity), size(0) {head = new Node();tail = new Node();head->next = tail;tail->last = head;}int get(int key) {if (cache.count(key) == 0)return -1;Node *node = cache[key];move(node);return node->value;}void put(int key, int value) {if (cache.count(key) > 0) {Node *node = cache[key];node->value = value;move(node);}else {Node *node = new Node(key, value);cache[key] = node;addNode(node);++size;if (size > capacity) {Node *lastUsed = deleteTail();cache.erase(lastUsed->key);--size;delete lastUsed;}}}
};

版权声明:

本网仅为发布的内容提供存储空间,不对发表、转载的内容提供任何形式的保证。凡本网注明“来源:XXX网络”的作品,均转载自其它媒体,著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处。

我们尊重并感谢每一位作者,均已注明文章来源和作者。如因作品内容、版权或其它问题,请及时与我们联系,联系邮箱:809451989@qq.com,投稿邮箱:809451989@qq.com