leetcode146 LRU 快取機制

2021-10-03 05:35:24 字數 2137 閱讀 6561

1.資料結構

為了滿足o(1)的複雜度,需要雜湊表。另外還需要雙向鍊錶存放(key,value).

雜湊表中存放(key, key在鍊錶中的位置)。

2.演算法

2.1 get操作

if key不存在:

直接返回-1

else

在原煉表中刪除(key,value)

將(key,value)重新放回鍊錶的頭部

更新雜湊表

返回value

2.2 put操作
if key存在:

在原煉表中刪除(key, value)

將(key,value)重新放回鍊錶的頭部

更新雜湊表

else

if 鍊錶長度達到上限:

獲取鍊錶尾部的key

在雜湊表中刪除key

刪除鍊錶尾部元素

將新的(key,value)插入鍊錶頭部

將(key, key在鍊錶中的位置)放入雜湊表

else

將新的(key,value)插入鍊錶頭部

將(key, key在鍊錶中的位置)放入雜湊表

3.實現

自己實現雙向鍊錶,map中存放(key,node)

class

lrucache

;void

addnode

(dlinkednode* node)

intremovenode

(dlinkednode* node)

void

movetohead

(dlinkednode* node)

private

: unordered_map<

int,dlinkednode*

> cache;

dlinkednode* head;

dlinkednode* tail;

int size;

int capacity;

public

:lrucache

(int capacity)

intget

(int key)

movetohead

(it-

>second)

;return it-

>second-

>value;

}void

put(

int key,

int value)

}else}}

;/**

* 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);

*/

或者使用庫中的list,map中存放(key,迭代器)

class

lrucache

intget

(int key)

void

put(

int key,

int value)

else

cachelist.

push_front

(make_pair

(key,value));

map.

insert

(make_pair

(key,cachelist.

begin()

));}

}};/**

* 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);

*/

學渣帶你刷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 如果金鑰不存在,則寫入其資料值。當快取容量...