LeetCode 0146 LRU快取機制

2021-09-29 18:55:16 字數 2038 閱讀 7560

運用你所掌握的資料結構,設計和實現乙個 lru (最近最少使用) 快取機制。它應該支援以下操作: 獲取資料 get 和 寫入資料 put 。

獲取資料 get(key) - 如果金鑰 (key) 存在於快取中,則獲取金鑰的值(總是正數),否則返回 -1。

寫入資料 put(key, value) - 如果金鑰不存在,則寫入其資料值。當快取容量達到上限時,它應該在寫入新資料之前刪除最近最少使用的資料值,從而為新的資料值留出空間。

高階:

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

示例:

lrucache cache = new lrucache( 2 /* 快取容量 */ );

cache.put(1, 1);

cache.put(2, 2);

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

cache.put(3, 3); // 該操作會使得金鑰 2 作廢

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

cache.put(4, 4); // 該操作會使得金鑰 1 作廢

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

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

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

class

node

}class

doublelinkedlist

// 在鍊錶頭部新增節點 x

public

void

addfirst

(node x)

// 刪除鍊錶中的 x 節點(x 一定存在)

public

void

remove

(node x)

// 刪除鍊錶中最後乙個節點,並返回該節點

public node removelast()

public

intsize()

}class

lrucache

public

intget

(int key)

public

void

put(

int key,

int val)

else

if(capacity == cache.

size()

)

cache.

addfirst

(x);

// 更新 map 中對應的資料

map.

put(key, x);}

}/**

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

*/

時間複雜度:o(1

)o(1)

o(1)

空間複雜度:o(n

)o(n)

o(n)

。直接使用linkedhashmap

class

lrucache

public

intget

(int key)

return-1

;}public

void

put(

int key,

int value)

else

if(map.

size()

== capacity)

map.

put(key, value);}

}

LRU快取機制 LeetCode

演算法思想 1 關鍵字存在 變更資料。2 關鍵字不存在 判斷快取容量是否達到上限 達到了上限,則應該刪除最久未使用的資料 未達上限,直接新增。get約束條件如下 如果關鍵字在快取,獲取該關鍵字的值,否則返回 1。此題目要求的資料結構需要滿足 查詢快 插入 刪除快且有順序之分的特點。於是結合兩個資料結...

leetcode題目 LRU快取機制

題目 運用你所掌握的資料結構,設計和實現乙個 lru 最近最少使用 快取機制 實現 lrucache 類 lrucache int capacity 以正整數作為容量 capacity 初始化 lru 快取 int get int key 如果關鍵字 key 存在於快取中,則返回關鍵字的值,否則返回...

LeetCode 經典題 LRU快取

lru演算法應該對所有計算機 軟工的同學都不陌生了。那麼要如何實現lru演算法呢?lru演算法需要設計乙個資料結構,這個資料結構有兩個操作,乙個是get key 獲取key對應的value,如果key不存在則返回 1 put key,value 存入鍵值對 以上兩個操作的複雜度都應該為o 1 分析上...