牛客刷題 設計LRU快取結構

2021-10-18 15:55:57 字數 1218 閱讀 4679

題目:

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

[要求]

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]

首先分析題目中要求實現的兩個操作,get和set,這裡可以直接使用hashmap進行實現,不過這裡對快取區(map)的大小有限制,所以後面需要進行限制,分情況處理,有空間或者是執行更新操作時,直接set,空間不足時則需要先刪除後set,刪除則是根據lru演算法的最近最少使用進行確定。lru演算法的最近最少使用,可以設計乙個輔助類,類包含key和time兩個字段,time從0開始遞增,每次操作key時更新time的值來模擬時間,將所有的操作資訊放到list中,在進行刪除的時候對list降序排序,取最後的乙個的key,在list和map中進行刪除即可。

完整**如下:

class usetimes

public static int lru (int operators, int k)

});int leasttuse = uselist.get(uselist.size()-1).key;

map.remove(leasttuse);

uselist.remove(uselist.size()-1);

map.put(operators[i][1], operators[i][2]);

usetimes use = new usetimes();

use.key = operators[i][1];

use.time = count++;

uselist.add(use);

}}else if(symbol==2) else }}

}} int ans = new int[res.size()];

for(int i=0;ireturn ans;

}

牛客NC93 設計LRU快取結構

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

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

本題鏈結 設計lru快取結構,該結構在構造時確定大小,假設大小為k,並有如下兩個功能 set key,value 將記錄 key,value 插入該結構 get key 返回key對應的value值 要求 set和get方法的時間複雜度為o 1 某個key的set或get操作一旦發生,認為這個key...

牛客 設計LRU快取結構(map和鍊錶)

本題鏈結 題目描述設計lru快取結構,該結構在構造時確定大小,假設大小為k,並有如下兩個功能 set key,value 將記錄 key,value 插入該結構 get key 返回key對應的value值 要求set和get方法的時間複雜度為o 1 某個key的set或get操作一旦發生,認為這個...