日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

Leetcode: LRU Cache

發布時間:2023/11/30 编程问答 18 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Leetcode: LRU Cache 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

題目

Design and implement a data structure for Least Recently Used (LRU) cache. It should support the following operations:?get?and?set.

get(key)?- Get the value (will always be positive) of the key if the key exists in the cache, otherwise return -1.
set(key, value)?- Set or insert the value if the key is not already present. When the cache reached its capacity, it should invalidate the least recently used item before inserting a new item.

?

思路

1. 雙向鏈表支持常數時間增刪元素, 單向鏈表配合 hash table 也可以實現, 但是實現相當復雜

2. hash table 存儲鏈表中的元素

?

總結

1. 雙向鏈表要處理的情況比單向鏈表更復雜

2. 單向鏈表處理時, 僅需考慮 head 的問題, 但雙向鏈表則需要考慮

  a) 增元素時, 考慮鏈表是否為空即 head 問題

  b) 刪元素時, 要考慮被刪除的元素是否為 head?

  c) LRU 操作, 前移元素時, 需要考慮被前移的元素是否為 Head, 這一個 bug 浪費了 2 個小時

  d) 有一個優化, 即 LRU set miss 時, 不需要顯式的刪除再增加節點, 僅需將 tail 節點的 key, value 修改 然后 head 前進一步即可

?

代碼

class Node { public:int key, value;Node *next, *pre;Node(int _key, int _value):key(_key), value(_value), next(NULL), pre(NULL){} }; class LRUCache{ public:int capacity;int curSize;unordered_map<int, Node*> mp;Node *head;LRUCache(int capacity) {this->capacity = capacity;curSize = 0;}int get(int key) {if(mp.find(key) == mp.end())return -1;int val = mp.find(key)->second->value;set(key, val);return val;}void set(int key, int value) {int ans = 0;if(mp.find(key) == mp.end())ans = -1;if(ans == -1) { // 新建一個 itemif(curSize >= capacity) { // 已滿, 需要刪除一個 itemif(capacity == 1) {mp.erase(mp.find(head->key));head->key = key;head->value = value;mp[key] = head;return;}else{ // 模擬刪除隊尾元素Node *tail = head->pre;mp.erase(mp.find(tail->key));tail->key = key;tail->value = value;head = tail;mp[key] = head;return;}}// 未滿, 添加元素if(curSize == 0) {head = new Node(key, value);head->pre = head;head->next = head;mp[key] = head;curSize++;return ;}else {Node *al = new Node(key, value);al->pre = head->pre;al->next = head;al->pre->next = al;head->pre = al;head = al;mp[key] = al;curSize++;return;}}else{if(head->key == key) {head->value = value;mp[key] = head;return;}//cout << "here" << endl;Node *mid = mp.find(key)->second;mid->next->pre = mid->pre;mid->pre->next = mid->next;mid->value = value;mid->next = head;mid->pre = head->pre;head->pre = mid;mid->pre->next = mid;head = mid;mp[key] = mid; // 修改 mp[key]return;}} };

  

?

Update?

#include <iostream> #include <map> using namespace std;class ListNode1 { public:ListNode1(int _key, int _val) {key = _key;val = _val;pre = next = NULL;}ListNode1 *pre;int key;int val;ListNode1 *next; };class LRUCache{ public:LRUCache(int capacity) {this->capacity = capacity;head = NULL;size = 0;}int get(int key) {if(mp.count(key) == 0)return -1;int value = mp[key]->val;set(key, value);return value;}void set(int key, int value) {if(capacity == 1) {mp.clear();head = new ListNode1(key, value);mp[key] = head;return;}if(mp.count(key) > 0) {ListNode1 *curNode = mp[key];curNode->val = value;if(curNode == head)return;curNode->pre->next = curNode->next;curNode->next->pre = curNode->pre;head->pre->next = curNode;curNode->pre = head->pre;curNode->next = head;head->pre = curNode;head = curNode;return;}if(size < capacity) {size ++;ListNode1 *newNode = new ListNode1(key, value);mp[key] = newNode;if(size == 1) {newNode->pre = newNode;newNode->next = newNode;head = newNode;return;}head->pre->next = newNode;newNode->pre = head->pre;newNode->next = head;head->pre = newNode;head = newNode;return;}// size >= capacityListNode1 *tail = head->pre;mp.erase(mp.find(tail->key));mp[key] = tail;tail->key = key;tail->val = value;head = tail;} private:int capacity;int size;map<int, ListNode1*> mp;ListNode1 *head; };

?

轉載于:https://www.cnblogs.com/xinsheng/p/3514968.html

總結

以上是生活随笔為你收集整理的Leetcode: LRU Cache的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。