Leetcode 146 LRU Cache(雙向連結串列+STL)
解題思路:用一個雙向連結串列,維護一個最近訪問次序,用map記錄對應key的結點指標。對於get請求,需要將當前結點移動到連結串列的頭位置;對於put操作,如果是更新,則同樣將當前結點移動到頭位置,如果不是更新,則在頭位置插入一個新結點。如果連結串列長度超過快取上限,則刪除末尾結點並清空map中對應的記錄。
class LRUCache { private: class Node { public: Node(int key, int val): key(key), val(val), pre(NULL), nex(NULL) {} int key; int val; Node* pre; Node* nex; }; Node* head; Node* tail; int capacity; int size; map<int, Node*> cached; public: LRUCache(int capacity) { this->size = 0; this->capacity = capacity; this->head = NULL; this->tail = NULL; } void moveToHead(Node* curr) { if (curr == head) return; Node* pre = curr->pre; Node* nex = curr->nex; if (pre != NULL) pre->nex = nex; if (nex != NULL) nex->pre = pre; if (tail == curr) tail = pre; head->pre = curr; curr->nex = head; curr->pre = NULL; head = curr; } int get(int key) { if (capacity == 0) return -1; if (cached.count(key)) { Node* temp = cached[key]; moveToHead(temp); return temp->val; } return -1; } void put(int key, int value) { if (capacity == 0) return; if (cached.count(key)) { moveToHead(cached[key]); cached[key]->val = value; return; } Node* temp = new Node(key, value); temp->pre = NULL; temp->nex = head; if (head != NULL) head->pre = temp; head = temp; if (tail == NULL) tail = temp; cached[key] = temp; size++; if (size > capacity) { if (cached[tail->key] == tail) cached.erase(tail->key); Node* last = tail; tail = tail->pre; tail->nex = NULL; delete last; size--; } } }; /** * 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 Cache(雙向連結串列+STL)
解題思路:用一個雙向連結串列,維護一個最近訪問次序,用map記錄對應key的結點指標。對於get請求,需要將當前結點移動到連結串列的頭位置;對於put操作,如果是更新,則同樣將當前結點移動到頭位置,如果不是更新,則在頭位置插入一個新結點。如果連結串列長度超過快取上限,則刪除末
HDU 6215 Brute Force Sorting(雙向連結串列+佇列)
Brute Force Sorting Time Limit: 1000/1000 MS (Java/Others) Memory Limit: 65535/32768 K (Java/Others) Total Submission(s): 2304 Acce
LeetCode Sliding Window Maximum 滑動視窗(雙向連結串列實現佇列效果)
思路: 使用雙向連結串列(LinkedList,LinkedList類是雙向列表,列表中的每個節點都包含了對前一個和後一個元素的引用)。 雙向連結串列的大小就是視窗的個數,每次向視窗中增加一個元素時,如果比視窗中最後一個大,就刪除視窗中最後一個,以此類推,來
LeetCode 146 LRU Cache
code hash head width validate return .com opera != Design and implement a data structure for Least Recently Used (LRU) cach
LeetCode 146. LRU Cache
高頻題,需要用unordered_map和list,做到O(1) 需要注意的一點是,list用了splice改變了節點的位置,但是iterator並不會失效,這也代表unordered_map不需要進行更新。(可以把iterator當成指標方便理解) class LRUCache { public
[leetcode] 146. LRU Cache
https://leetcode.com/problems/lru-cache/description/ class LRUCache { private: int _capacity; list<pair<int, int> >
手寫LinkedList(雙向連結串列)
手寫LinkedList(雙向連結串列) 系統jdk裡的LinkedList是由一個個節點連線起來的,節點就相當於一個物件,裡面有資料域和指標域,資料域是存放資料用的,指標域就是指向下一個節點 從而相連線的 這裡是一個節點 那麼連結串列裡是什麼樣子的呢
Lava連結串列(雙向連結串列---介面實現)
在Java中連標配的結點需要用類來封裝,下面的簡單的雙向連結串列實現: class Node { private Object data; private Node next; public Node(Object data) {
Leetcode 430.扁平化多級雙向連結串列
扁平化多級雙向連結串列 您將獲得一個雙向連結串列,除了下一個和前一個指標之外,它還有一個子指標,可能指向單獨的雙向連結串列。這些子列表可能有一個或多個自己的子項,依此類推,生成多級資料結構,如下面的示例所示。 扁平化列表,使所有結點出現在單級雙鏈表中。您將獲得列表第一級的頭部。 &nb
C++ 類模板小結(雙向連結串列的類模板實現)
一、類模板定義 定義一個類模板:template<class 模板引數表> class 類名{ // 類定義...... };其中,template 是宣告類模板的關鍵字,表示宣告一個模板,模板引數可以是一個,也可以是多個,可以是型別引數,也可以是非型別引數。型
[LeetCode] 146. LRU Cache java
/**146. LRU Cache * @date: 2016年10月27日 * @description: http://blog.csdn.net/sbitswc/article/details/35899935 */ private H
HDU 4286 Data Handler (雙向連結串列)
Time Limit: 20000/10000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) P
Objective-C之Autorelease Pool底層實現原理記錄(雙向連結串列)以及在Runloop中是如何參與進去的
最近需要重新整理知識點備用,把一些重要的原理都搞了一遍 前言 int main(int argc, char * argv[]) { @autoreleasepool { return UIApplicationMain(argc, a
連結串列倒序問題(雙向連結串列的基礎運用)
#include <stdio.h> #include <stdlib.h> struct node { int key; struct node *next,*before;//結構中包含前向指標before,後向指標next };
LeetCode | Linked List Cycle(判斷連結串列是否有環)
Given a linked list, determine if it has a cycle in it. Follow up: Can you solve it without using extra space? 題目解析: 判斷是否有環,只需要快慢指標即可。
c++stl的list(雙向連結串列)
1.list初始化: (1)list<int> t; //沒有任何元素 (2)list<int> t(10); //建立有10個元素的連結串列 (3)lis
[Leetcode-146] LRU Cache 最近最少使用頁面置換演算法
題目概要 AC 程式碼 0. 題目概要 Design and implement a data structure for Least Recently Used (LRU) cache. It should support the foll
bzoj 4548: 小奇的糖果 && bzoj 3658: Jabberwocky(雙向連結串列+樹狀陣列)
Time Limit: 20 Sec Memory Limit: 1024 MBSubmit: 263 Solved: 107 [Submit][Status][Discuss] Description 平面上有n個點,每個點有k種顏色中的一個。 你可以選擇一條
LRU快取策略(雙向連結串列實現)
雙向連結串列實現LRU Cache注意1.各種邊界條件(改節點位置的時候考慮節點目前的位置) 2.查詢到,插入(分update,set)都要考慮找到元素的位置的修改。複雜度get,set為O(n)public class LRUCache { int ca
資料結構與算法系列五(雙向連結串列)
1.引子 1.1.為什麼要學習資料結構與演算法? 有人說,資料結構與演算法,計算機網路,與作業系統都一樣,脫離日常開發,除了面試這輩子可能都用不到呀! 有人說,我是做業務開發的,只要熟練API,熟練框架,熟練各種中介軟體,寫的程式碼不也能“飛”起來嗎? 於是問題來了:為什麼還要學習資料結構與演算法呢?