leetcode 146 LRU 快取機制

2021-10-19 13:27:57 字數 2006 閱讀 1671

146. lru 快取機制

運用你所掌握的資料結構,設計和實現乙個 lru (最近最少使用) 快取機制 。

實現lrucache類:

高階:你是否可以在o(1)時間複雜度內完成這兩種操作?

示例:

輸入

["lrucache", "put", "put", "get", "put", "get", "put", "get", "get", "get"]

[[2], [1, 1], [2, 2], [1], [3, 3], [2], [4, 4], [1], [3], [4]]

輸出[null, null, null, 1, null, -1, null, -1, 3, 4]

解釋lrucache lrucache = new lrucache(2);

lrucache.put(1, 1); // 快取是

lrucache.put(2, 2); // 快取是

lrucache.get(1); // 返回 1

lrucache.put(3, 3); // 該操作會使得關鍵字 2 作廢,快取是

lrucache.get(2); // 返回 -1 (未找到)

lrucache.put(4, 4); // 該操作會使得關鍵字 1 作廢,快取是

lrucache.get(1); // 返回 -1 (未找到)

lrucache.get(3); // 返回 3

lrucache.get(4); // 返回 4

struct dlinkednode 

dlinkednode(int _key, int _value) : key(_key), value(_value), prev(nullptr), next(nullptr) {}

};class lrucache

// o(1) ,因為儲存結構是unordered_map,底層結構是雜湊表

int get(int key)

movehead(cache[key]);

return cache[key]->value;

} void put(int key, int value)

// 新增新結點

node = new dlinkednode(key, value);

cache[key] = node; // 存入快取中,方便讀取

addnode(node);

size++;

return ;

} cache[key]->value = value;

movehead(cache[key]);

} void addnode(dlinkednode *node)

// 只是移出鍊錶,不delete是為了方便get時候更新鍊錶

void delnode(dlinkednode *node)

// 移動結點到頭部

void movehead(dlinkednode *node)

// 記憶體誰申請,誰管理,所以刪除要放在put中

dlinkednode * deltail()

};int main()

lrucache.put(2, 2); // 快取是

lrucache.get(1); // 返回 1

lrucache.put(3, 3); // 該操作會使得關鍵字 2 作廢,快取是

lrucache.get(2); // 返回 -1 (未找到)

lrucache.put(4, 4); // 該操作會使得關鍵字 1 作廢,快取是

lrucache.get(1); // 返回 -1 (未找到)

lrucache.get(3); // 返回 3

lrucache.get(4); // 返回 4

}

學渣帶你刷Leetcode146 LRU快取機制

運用你所掌握的資料結構,設計和實現乙個 lru 最近最少使用 快取機制。它應該支援以下操作 獲取資料 get 和 寫入資料 put 獲取資料 get key 如果金鑰 key 存在於快取中,則獲取金鑰的值 總是正數 否則返回 1。寫入資料 put key,value 如果金鑰已經存在,則變更其資料值...

leetcode146 LRU快取機制

運用你所掌握的資料結構,設計和實現乙個 lru 最近最少使用 快取機制。它應該支援以下操作 獲取資料 get 和 寫入資料 put 獲取資料 get key 如果金鑰 key 存在於快取中,則獲取金鑰的值 總是正數 否則返回 1。寫入資料 put key,value 如果金鑰不存在,則寫入其資料值。...

LeetCode 146 LRU快取機制

運用你所掌握的資料結構,設計和實現乙個 lru 最近最少使用 快取機制。它應該支援以下操作 獲取資料get和 寫入資料put。獲取資料get key 如果金鑰 key 存在於快取中,則獲取金鑰的值 總是正數 否則返回 1。寫入資料put key,value 如果金鑰不存在,則寫入其資料值。當快取容量...