Leetcode 460

Leetcode 460 LFUCache

实现一个最近使用频率最少的置换器,即当容量满时,剔除最近最少使用的项。

解法

  1. 设置几个不同的unordered_map代表不同的作用
    unordered_map<int,int> valMap: 键:key, 值:value
    unordered_map<int,int> freqMap: 键:key, 值:freq
    unordered_map<int,list<int>> bucketMap: 键:freq, 值:list<int>
    unordered_map<int,list<int>::iterator> iterMap: 键:key, 值:list<int>::iterator</int></int></int></int>
Increasing frequencies
---------------------------------->

+------+    +---+    +---+    +---+
| Head |----| 1 |----| 5 |----| 9 |  Frequencies
+------+    +-+-+    +-+-+    +-+-+
              |        |        |
            +-+-+    +-+-+    +-+-+     |
            |2,3|    |4,3|    |6,2|     |
            +-+-+    +-+-+    +-+-+     | Most recent
                       |        |       |
                     +-+-+    +-+-+     |
 key,value pairs     |1,2|    |7,9|     |
                     +---+    +---+     v

代码:https://zhanghuimeng.github.io/post/leetcode-460-lfu-cache/#fn4(强烈推荐这个博客)

class LFUCache{
    unordered_map<int,int> valMap: 键:key, 值:value
    unordered_map<int,int> freqMap: 键:key, 值:freq
    unordered_map<int,list<int>> bucketMap: 键:freq, 值:list<int>
    unordered_map<int,list<int>::iterator> iterMap: 键:key, 值:list<int>::iterator
    int num;
    int cap;
    int minfreq;    

    LFUCache(int capacity){
        cap = capacity;
        minfreq =1;
        num = 0;         
    }

    void touch(int key){
        int freq = freqMap[key];
        auto it = iterMap[key];
        bucketMap[freq].erase(it);
        if(freq==minfreq && bucketMap[freq].empty())
            minfreq++;
        freqMap[key] = freq+1;
        bucketMap[freq+1].push_front(key);
        iterMap[key] = bucketMap[freq+1].begin();
        return;
    }

    void get(int key){
        if(!freqMap.count(key)) return -1;
        int val = valMap[key];
        touch(key);
        return val;
    }

    void put(key,value){
         if(cap==0) return;
        if(freqMap.count(key)){
            int val = valMap[key];
            valMap[key] = value;
            touch(key);
            return;
        }

        if(num>=cap){
            int evict = bucketMap[minfreq].back();
            bucketMap[minfreq].pop_back();
            valMap.erase(evict);
            freqMap.erase(evict);
            iterMap.erase(evict);
            num--;
        }

        minfreq = 1;
        bucketMap[1].push_front(key);
        valMap[key] = value;
        iterMap[key] = bucketMap[1].begin();
        freqMap[key] = 1;
        num++;
    }

}
全部评论

相关推荐

代码飞升:别用口语,后端就写后端,前端就写前端,最后别光后悔
点赞 评论 收藏
分享
不愿透露姓名的神秘牛友
07-02 17:28
25届每天都在焦虑找工作的事情0offer情绪一直很低落硬撑着面了一个岗位岗位有应酬的成分面试的时候hr给我出各种场景题问的问题比较犀利&nbsp;有点压力面的感觉感觉有点回答不上来本来就压抑的情绪瞬间爆发了呢一瞬间特别想哭觉得自己特别没用没绷住掉眼泪了事后想想觉得自己挺有病的&nbsp;真的破大防了
喜欢唱跳rap小刺猬...:我觉得没关系吧,之前有一次面试leader给我压力面,我顶住了压力,结果入职的时候发现组里氛围很差,果断跑路。其实从面试就能大概看出组的情况,面试体验好的组倒是不一定好,但是面试体验不好的组。。。就很难说
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务