牛客題霸 研發 NC93 設計LRU快取結構

2021-10-19 02:42:19 字數 1786 閱讀 5974

----------------------------------------------本題鏈結----------------------------------------------

設計lru快取結構,該結構在構造時確定大小,假設大小為k,並有如下兩個功能:

set(key, value):將記錄(key, value)插入該結構

get(key):返回key對應的value值

[要求]

set和get方法的時間複雜度為o(1)

某個key的set或get操作一旦發生,認為這個key的記錄成了最常使用的。

當快取的大小超過k時,移除最不經常使用的記錄,即set或get最久遠的。

若opt=1,接下來兩個整數x, y,表示set(x, y)

若opt=2,接下來乙個整數x,表示get(x),若x未出現過或已被移除,則返回-1

對於每個操作2,輸出乙個答案

輸入

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

返回值[1,-1]

說明:

第一次操作後:最常使用的記錄為(「1」, 1)

第二次操作後:最常使用的記錄為(「2」, 2),(「1」, 1)變為最不常用的

第三次操作後:最常使用的記錄為(「3」, 2),(「1」, 1)還是最不常用的

第四次操作後:最常用的記錄為(「1」, 1),(「2」, 2)變為最不常用的

第五次操作後:大小超過了3,所以移除此時最不常使用的記錄(「2」, 2),加入記錄(「4」, 4),並且為最常使用的記錄,然後(「3」, 2)變為最不常使用的記錄

lru = least recently used (最近最少使用)

很容易想到map操作,關鍵點在於:

map容量達到k值的時候,set需要刪除最初不常用的值,同時put進去最新的值

get獲取map裡的值,如果存在則返回key對應value,且該值變為最常用

這些要求讓人聯想到佇列操作:先進入map的被擠出佇列,get獲取到就再讓該值入佇列一次(這樣可以讓頭部鍵值對總為最不常用)

從而考慮用順序存放的linkedhashmap來操作(就是時間和空間複雜度有點高)

判斷異常情況

遍歷陣列判斷操作

2.1 set: 沒有超過k值,則存入;超過k值,則刪除map開頭,再存入

2.2 get: map有key,則儲存對應value值,並將該鍵值對先刪除再存入;map沒有key,返回-1

輸出結果

public

class

solution

else

}int

resarr =

newint

[res.

size()

];int i =0;

for(

int x : res)

return resarr;

}private

void

set(

int key,

int val)

else

}private

void

get(

int key)

else

}}

牛客NC93 設計LRU快取結構

設計lru快取結構,該結構在構造時確定大小,假設大小為k,並有如下兩個功能 要求 set和get方法的時間複雜度為o 1 某個key的set或get操作一旦發生,認為這個key的記錄成了最常使用的。當快取的大小超過k時,移除最不經常使用的記錄,即set或get最久遠的。若opt 1,接下來兩個整數x...

NC93 設計LRU快取結構

知識點 雜湊表 鍊錶 題目鏈結 題目描述 設計lru快取結構,該結構在構造時確定大小,假設大小為k,並有如下兩個功能 要求 set和get方法的時間複雜度為o 1 某個key的set或get操作一旦發生,認為這個key的記錄成了最常使用的。當快取的大小超過k時,移除最不經常使用的記錄,即set或ge...

牛客題霸 研發 NC127 最長公共子串

本題鏈結 給定兩個字串str1和str2,輸出兩個字串的最長公共子串,如果最長公共子串為空,輸出 1。輸入 1ab2345cd 12345ef 返回值 2345 動態規劃問題 假設兩個字串長度為n m,具體分析其問題 最優子結構 如果知道 n 1 m 1 長度字串的最長公共子串s,則 n m 長度字...