Leetcode 460. LFU 缓存

题目

在这里插入图片描述
Leetcode 460. LFU 缓存

代码(8.30 首刷看解析)

#include <unordered_map>
#include <unordered_set>
class Solution {
    
    
public:
    vector<int> LFU(vector<vector<int> >& operators, int k) {
    
    
        this->cap = k;
        this->minFreq = 0;
        vector<int> res;
        for (auto& v : operators) {
    
    
            int opt = v[0];
            if(opt == 1) {
    
    
                set(v[1], v[2]);
            } else {
    
    
                res.emplace_back(get(v[1]));
            }
        }
        return res;
    }
    int get(int key) {
    
    
        if(!key2val.count(key))
            return -1;
        increaseFreq(key);
        return key2val[key];
    }
    void set(int key, int value) {
    
    
        if(this->cap <= 0)
            return;
        if(key2val.count(key)) {
    
        // 如果存在
            increaseFreq(key);
            key2val[key] = value;
            return;
        }
        // 如果不存在,需要判断是否满了
        if(key2val.size() >= this->cap) {
    
    
            auto& ls = freq2keys[minFreq];
            int deleteKey = ls.back();
            ls.pop_back();
            if(ls.empty()) {
    
    
                freq2keys.erase(minFreq);
            }
            key2val.erase(deleteKey);
            key2freq.erase(deleteKey);
        }
        key2val[key] = value;
        key2freq[key] = 1;
        freq2keys[1].push_front(key);
        this->minFreq = 1;
    }
private:
    void increaseFreq(int key) {
    
    
        int freq = key2freq[key];
        key2freq[key]++;
        freq2keys[freq].remove(key);

        if(freq2keys[freq].empty()) {
    
    
            freq2keys.erase(freq);
            if(this->minFreq == freq)
                this->minFreq++;
        } 
        freq2keys[freq+1].push_front(key);
    }
    int minFreq;
    int cap;
    unordered_map<int, int> key2val;
    unordered_map<int, int> key2freq;
    unordered_map<int, list<int>> freq2keys;
};

猜你喜欢

转载自blog.csdn.net/weixin_51322383/article/details/132590007