1. 程式人生 > >Leetcode 146 LRU Cache(雙向連結串列+STL)

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,熟練框架,熟練各種中介軟體,寫的程式碼不也能“飛”起來嗎? 於是問題來了:為什麼還要學習資料結構與演算法呢?