• LeetCode 146 LRU Cache


    Design and implement a data structure for Least Recently Used (LRU) cache. It should support the following operations: get and set.

    get(key) - Get the value (will always be positive) of the key if the key exists in the cache, otherwise return -1.
    set(key, value) - Set or insert the value if the key is not already present. When the cache reached its capacity, it should invalidate the least recently used item before inserting a new item.

    思路:HashMap+双链表
    class Node {
    	Node pre;
    	Node next;
    	int key;
    	int value;
    
    	Node(int k, int val) {
    		key = k;
    		value = val;
    	}
    }
    
    public class LRUCache {
    	HashMap<Integer, Node> hm;
    	Node head, tail;
    	int size;
    
    	public LRUCache(int capacity) {
    		hm = new HashMap<Integer, Node>();
    		head = new Node(-1, -1);
    		tail = new Node(0, 0);
    		size = capacity;
    		head.next = tail;
    		tail.pre = head;
    	}
    
    	public int get(int key) {
    		if (hm.containsKey(key)) {
    			Node p = hm.get(key);
    			putToHead(p);
    			return p.value;
    		}
    		return -1;
    	}
    
    	public void set(int key, int value) {
    		if (hm.containsKey(key)) {
    			Node p = hm.get(key);
    			p.value = value;
    			hm.put(key, p);
    			putToHead(p);
    		} else if (hm.size() < size) {
    			Node p = new Node(key, value);
    			putToHead(p);
    			hm.put(key, p);
    		} else {
    			Node p = new Node(key, value);
    			putToHead(p);
    			hm.put(key, p);
    			int tmpkey = removeEnd();
    			hm.remove(tmpkey);
    		}
    	}
    
    	private int removeEnd() {
    		Node p = tail.pre;
    		tail.pre.pre.next = tail;
    		tail.pre = p.pre;
    		p.pre = null;
    		p.next = null;
    		return p.key;
    	}
    
    	private void putToHead(Node p) {
    		if (p.next != null && p.pre != null) {
    			p.pre.next = p.next;
    			p.next.pre = p.pre;
    		}
    		p.pre = head;
    		p.next = head.next;
    		head.next.pre = p;
    		head.next = p;
    	}
    }
    


  • 相关阅读:
    函数嵌套 lisp表达式求值
    初涉时间间隔问题
    高精度算法-带小数大数相加
    12/10 C语言程序设计竞赛 后五题
    字符串头尾连接问题-木棒连接
    ZJGSU-ACM OJ 心得
    高精度算法-大数乘法
    趣味两题-(简单追及问题、两直线相交问题)
    struts2基于注解的action
    spring中常用的注解
  • 原文地址:https://www.cnblogs.com/jzssuanfa/p/7039940.html
Copyright © 2020-2023  润新知