生活随笔
收集整理的這篇文章主要介紹了
LeetCode 460. LFU缓存(哈希双链表)
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
1. 題目
設計并實現最不經常使用(LFU)緩存的數據結構。它應該支持以下操作:get 和 put。
- get(key) - 如果鍵存在于緩存中,則獲取鍵的值(總是正數),否則返回 -1。
- put(key, value) - 如果鍵不存在,請設置或插入值。
- 當緩存達到其容量時,它應該在插入新項目之前,使最不經常使用的項目無效。
- 在此問題中,當存在平局(即兩個或更多個鍵具有相同使用頻率)時,最近最少使用的鍵將被去除。
進階:
你是否可以在 O(1) 時間復雜度內執行兩項操作?
示例:
LFUCache cache
= new LFUCache( 2 );
cache
.put(1, 1);
cache
.put(2, 2);
cache
.get(1);
cache
.put(3, 3);
cache
.get(2);
cache
.get(3);
cache
.put(4, 4);
cache
.get(1);
cache
.get(3);
cache
.get(4);
來源:力扣(LeetCode)
鏈接:https://leetcode-cn.com/problems/lfu-cache
著作權歸領扣網絡所有。商業轉載請聯系官方授權,非商業轉載請注明出處。
2. 解題
- 類似題目:LeetCode 146. LRU緩存機制(哈希鏈表)
class node{
public:int k
, v
, f
;node(int key
, int val
, int freq
):k(key
),v(val
),f(freq
){}
};class LFUCache {unordered_map
<int, list
<node
>::iterator
> kPos
;unordered_map
<int, list
<node
>> freq_list
;int cap
;int minfreq
;int size
;
public:LFUCache(int capacity
) {cap
= capacity
;minfreq
= 0;size
= 0;}int get(int key
) {if(kPos
.find(key
)==kPos
.end())return -1;auto it
= kPos
[key
];int f
= it
->f
;int v
= it
->v
;if(f
== minfreq
&& freq_list
[f
].size() == 1)minfreq
++;freq_list
[f
].erase(it
);freq_list
[++f
].push_front(node(key
,v
,f
));kPos
[key
] = freq_list
[f
].begin();return v
;}void put(int key
, int value
) {if(kPos
.find(key
)!=kPos
.end()){ auto it
= kPos
[key
];int f
= it
->f
;if(f
== minfreq
&& freq_list
[f
].size()==1)minfreq
++;freq_list
[f
].erase(it
);freq_list
[++f
].push_front(node(key
,value
,f
));kPos
[key
] = freq_list
[f
].begin();}else if(size
< cap
){minfreq
= 1;freq_list
[minfreq
].push_front(node(key
,value
,1));kPos
[key
] = freq_list
[1].begin();size
++;}else if(cap
!= 0 && size
== cap
){auto Node
= freq_list
[minfreq
].back();int k
= Node
.k
;freq_list
[minfreq
].pop_back();kPos
.erase(k
);size
--;put(key
, value
);}}
};
228 ms 40 MB
總結
以上是生活随笔為你收集整理的LeetCode 460. LFU缓存(哈希双链表)的全部內容,希望文章能夠幫你解決所遇到的問題。
如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。