LeetCode LRU快取機制

2022-09-13 15:33:10 字數 1727 閱讀 2817

運用你所掌握的資料結構,設計和實現乙個 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

//呼叫j**a底層的linkedhashmap實現lru

class lrucache

public int get(int key)

makerecently(key);

return cache.get(key);

}public void put(int key, int value)

if (cache.size() >= cap)

cache.put(key,value);

}//移到鍊錶尾

private void makerecently(int key)

}

public class lrucache 

}private mapcache = new hashmap<>();

private int size;

private int cap;

private node head,tail;

public lrucache(int capacity)

// 獲取元素,從cache中獲得val,node移到煉表頭

public int get(int key)

movetohead(node);

return node.val;

}public void put(int key, int value)

}else

}private void addtohead(node node)

private void movetohead(node node)

private void removenode(node node)

private node removetail()

} //思路1:deque 記錄cache順序,map訪問鍵值對

//思路2:雜湊鍊錶 使用linkedhashmap構建

//思路3:手寫雙向鍊錶 + hashmap 》put時檢查,map是否存在,重新賦值或新增,鍊錶新增。get時從map獲取,鍊錶移到最前面

Leetcode LRU快取機制

lru least recently used 最後思路 使用了linkedhashmap這個資料結構,它本身可以按訪問順序排序並且將剛剛訪問過的資料放在尾部。class lrucache public int get int key public void put int key,int valu...

Leetcode LRU快取機制

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

LeetCode LRU快取機制

使用雙向鍊錶來表示最久未使用的結點,最久未使用的結點放在了尾部 使用雜湊表來存放真正的資料 容量 int size 實際大小,當size超過capacity時,刪除最久未使用的結點 mapcache newhashmap 雜湊表用來存放真正的資料 dlinkednode head,tail 新增首尾...