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

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

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

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

1. 題目

設計并實現最不經常使用(LFU)緩存的數據結構。它應該支持以下操作:get 和 put。

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

進階:
你是否可以在 O(1) 時間復雜度內執行兩項操作?

示例: 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
著作權歸領扣網絡所有。商業轉載請聯系官方授權,非商業轉載請注明出處。

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;//key 對應的節點迭代器位置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++;//最小的頻數的節點只有1個,被移走了,最小頻數+1freq_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()){ //存在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();//頻數最小的鏈表末尾的刪除kPos.erase(k);//刪除末尾key對應的迭代器size--;put(key, value);}} };

228 ms 40 MB

總結

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

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。