Leetcode 460. LFU 缓存

文章目录

  • 题目
  • 代码(8.30 首刷看解析)

题目

Leetcode 460. LFU 缓存_第1张图片
Leetcode 460. LFU 缓存

代码(8.30 首刷看解析)

#include 
#include 
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;
};

你可能感兴趣的:(Leetcode专栏,算法,leetcode,职场和发展)