日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

LeetCode 460. LFU缓存(哈希双链表)

發(fā)布時(shí)間:2024/7/5 编程问答 37 豆豆
生活随笔 收集整理的這篇文章主要介紹了 LeetCode 460. LFU缓存(哈希双链表) 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

1. 題目

設(shè)計(jì)并實(shí)現(xiàn)最不經(jīng)常使用(LFU)緩存的數(shù)據(jù)結(jié)構(gòu)。它應(yīng)該支持以下操作:get 和 put。

  • get(key) - 如果鍵存在于緩存中,則獲取鍵的值(總是正數(shù)),否則返回 -1。
  • put(key, value) - 如果鍵不存在,請?jiān)O(shè)置或插入值。
  • 當(dāng)緩存達(dá)到其容量時(shí),它應(yīng)該在插入新項(xiàng)目之前,使最不經(jīng)常使用的項(xiàng)目無效。
  • 在此問題中,當(dāng)存在平局(即兩個(gè)或更多個(gè)鍵具有相同使用頻率)時(shí),最近最少使用的鍵將被去除。

進(jìn)階:
你是否可以在 O(1) 時(shí)間復(fù)雜度內(nèi)執(zhí)行兩項(xiàng)操作?

示例: LFUCache cache = new LFUCache( 2 /* capacity (緩存容量) */ ); cache.put(1, 1); cache.put(2, 2); cache.get(1); // 返回 1 cache.put(3, 3); // 去除 key 2 cache.get(2); // 返回 -1 (未找到key 2) cache.get(3); // 返回 3 cache.put(4, 4); // 去除 key 1 cache.get(1); // 返回 -1 (未找到 key 1) cache.get(3); // 返回 3 cache.get(4); // 返回 4

來源:力扣(LeetCode)
鏈接:https://leetcode-cn.com/problems/lfu-cache
著作權(quán)歸領(lǐng)扣網(wǎng)絡(luò)所有。商業(yè)轉(zhuǎn)載請聯(lián)系官方授權(quán),非商業(yè)轉(zhuǎn)載請注明出處。

2. 解題

  • 類似題目:LeetCode 146. LRU緩存機(jī)制(哈希鏈表)
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;//key 對(duì)應(yīng)的節(jié)點(diǎn)迭代器位置unordered_map<int, list<node>> freq_list;//不同的頻數(shù)下掛著一條雙鏈表,尾部是最少使用的int cap;int minfreq;//最小的頻數(shù)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];//找到對(duì)應(yīng)的迭代器int f = it->f;int v = it->v;if(f == minfreq && freq_list[f].size() == 1)minfreq++;//最小的頻數(shù)的節(jié)點(diǎn)只有1個(gè),被移走了,最小頻數(shù)+1freq_list[f].erase(it);//刪除freq_list[++f].push_front(node(key,v,f));//新頻數(shù)鏈表加入新節(jié)點(diǎn)kPos[key] = freq_list[f].begin();//記錄迭代器位置return v;}void put(int key, int value) {if(kPos.find(key)!=kPos.end()){ //存在keyauto 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)//不存在key,但還可插入{minfreq = 1;//新插入的只有1次freq_list[minfreq].push_front(node(key,value,1));kPos[key] = freq_list[1].begin();size++;}else if(cap != 0 && size == cap)//不存在key,且滿了,且容量不為0{auto Node = freq_list[minfreq].back();int k = Node.k;freq_list[minfreq].pop_back();//頻數(shù)最小的鏈表末尾的刪除kPos.erase(k);//刪除末尾key對(duì)應(yīng)的迭代器size--;put(key, value);}} };

228 ms 40 MB

總結(jié)

以上是生活随笔為你收集整理的LeetCode 460. LFU缓存(哈希双链表)的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。