----------------------------------------------本題鏈結----------------------------------------------
設計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 長度字...