leetcode-460LFU緩存

https://leetcode-cn.com/problems/lfu-cache/submissions/

方法一:哈希 + 平衡樹

時間複雜度:get 時間複雜度 O(logn),put 時間複雜度 O(logn)

空間複雜度:O(capacity)

struct node{
    int key,value,cnt,time;
    node(int _key,int _value,int _cnt,int _time):key(_key),value(_value),cnt(_cnt),time(_time){}
    bool operator < (const node &x) const {
        return cnt == x.cnt ? time < x.time : cnt < x.cnt;
    }
};
class LFUCache {
public: 
    unordered_map<int,node> m;
    set<node> s;
    int capacity,time;
    LFUCache(int _capacity) {
        capacity = _capacity;
        m.clear();
        s.clear();
        time = 0;
    }
    
    int get(int key) {
        if(capacity == 0) return -1;
        auto it = m.find(key);
        if(it == m.end()) return -1;
        node cache = it->second;
        s.erase(cache);
        cache.time = ++time;
        ++ cache.cnt;
        s.insert(cache);
        it->second = cache;
        //m[key] = cache;
        return cache.value;
    }
    
    void put(int key, int value) {
        if(capacity == 0) return ;
        auto it = m.find(key);
        if(it == m.end()){
            if(s.size() == capacity){
                m.erase(s.begin()->key);
                s.erase(s.begin());
            }
            node cache = node(key,value,1,++time);
            s.insert(cache);
            m.insert(make_pair(key,cache));
        }else{
            node cache = it->second;
            s.erase(cache);
            cache.time = ++time;
            ++ cache.cnt;
            cache.value = value;
            s.insert(cache);
            it->second = cache;
            //m[key] = cache;
        }

    }
};

/**
 * Your LFUCache object will be instantiated and called as such:
 * LFUCache* obj = new LFUCache(capacity);
 * int param_1 = obj->get(key);
 * obj->put(key,value);
 */
 
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章