题解 | #设计LRU缓存结构#

设计LRU缓存结构

http://www.nowcoder.com/practice/e3769a5f49894d49b871c09cadd13a61

知识点:双向哨兵链表

typedef struct Temp{
    struct Temp *prev;
    struct Temp *next;
    int key;
    int val;
}Temp;
map<int, Temp*> m;
Temp *head, *tail = NULL;
int maxk;


class Solution {
public:
    /**
     * lru design
     * @param operators int整型vector<vector<>> the ops
     * @param k int整型 the k
     * @return int整型vector
     */
    void init(){
        head = new Temp();
        tail = new Temp();
        head->prev = tail;
        head->next = tail;
        tail->prev = head;
        tail->next = head;
    }
    void _del(Temp *node){
        assert(node != head);
        assert(node != tail);
        Temp *prev = node->prev;
        Temp *next = node->next;
        prev->next = next;
        next->prev = prev;
        
    }
    void del(){
        if(tail->prev != head){
            Temp *prev = tail->prev;
            m.erase(prev->key);
            _del(prev);
        }
    }
    Temp* create(int key, int val){
        Temp* node = new Temp();
        node->key = key;
        node->val = val;
        return node;
    }
    void insert(Temp *node, Temp *prev){
        Temp *oldnext = prev->next;
        node->prev = prev;
        node->next = oldnext;
        prev->next = node;
        oldnext->prev = node;
    }
    void move2head(Temp * node){
        if(node->prev != head){
            _del(node);
            insert(node, head);
        }
    }
    void set(int key, int val){
        if(m.find(key) == m.end()){
            if(m.size() >= maxk){
                del();
            }
            Temp *n = create(key, val);
            m[key] = n;
            insert(n, head);
        }
        else{
            Temp *n = m[key];
            n->val = val;
            move2head(n);
        }
    }
    int get(int key, int val){
        if(m.find(key) == m.end()){
            return -1;
        }
        int ret = m[key]->val;
        move2head(m[key]);
        return ret;
    }
    vector<int> LRU(vector<vector<int> >& operators, int k) {
        // write code here
        maxk = k;
        init();
        vector<int> res;
        for(int i = 0; i < operators.size(); i++){
            vector<int> op = operators[i];
            int opt = op[0];
            int key = op[1];
            int val = op[2];
            if(opt == 1){
                set(key, val);
            }
            else{
                int ret = get(key, val);
                res.push_back(ret);
            }
            
        }
        return res;
        
    }
};
全部评论

相关推荐

评论
点赞
收藏
分享

创作者周榜

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