zoukankan      html  css  js  c++  java
  • LeetCode – LRU Cache (Java)

    Problem

    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.

    Java Solution

    The key to solve this problem is using a double linked list which enables us to quickly move nodes.

    import java.util.HashMap;
     
    public class LRUCache {
    	private HashMap<Integer, DoubleLinkedListNode> map 
    		= new HashMap<Integer, DoubleLinkedListNode>();
    	private DoubleLinkedListNode head;
    	private DoubleLinkedListNode end;
    	private int capacity;
    	private int len;
     
    	public LRUCache(int capacity) {
    		this.capacity = capacity;
    		len = 0;
    	}
     
    	public int get(int key) {
    		if (map.containsKey(key)) {
    			DoubleLinkedListNode latest = map.get(key);
    			removeNode(latest);
    			setHead(latest);
    			return latest.val;
    		} else {
    			return -1;
    		}
    	}
     
    	public void removeNode(DoubleLinkedListNode node) {
    		DoubleLinkedListNode cur = node;
    		DoubleLinkedListNode pre = cur.pre;
    		DoubleLinkedListNode post = cur.next;
     
    		if (pre != null) {
    			pre.next = post;
    		} else {
    			head = post;
    		}
     
    		if (post != null) {
    			post.pre = pre;
    		} else {
    			end = pre;
    		}
    	}
     
    	public void setHead(DoubleLinkedListNode node) {
    		node.next = head;
    		node.pre = null;
    		if (head != null) {
    			head.pre = node;
    		}
     
    		head = node;
    		if (end == null) {
    			end = node;
    		}
    	}
     
    	public void set(int key, int value) {
    		if (map.containsKey(key)) {
    			DoubleLinkedListNode oldNode = map.get(key);
    			oldNode.val = value;
    			removeNode(oldNode);
    			setHead(oldNode);
    		} else {
    			DoubleLinkedListNode newNode = 
    				new DoubleLinkedListNode(key, value);
    			if (len < capacity) {
    				setHead(newNode);
    				map.put(key, newNode);
    				len++;
    			} else {
    				map.remove(end.key);
    				end = end.pre;
    				if (end != null) {
    					end.next = null;
    				}
     
    				setHead(newNode);
    				map.put(key, newNode);
    			}
    		}
    	}
    }
     
    class DoubleLinkedListNode {
    	public int val;
    	public int key;
    	public DoubleLinkedListNode pre;
    	public DoubleLinkedListNode next;
     
    	public DoubleLinkedListNode(int key, int value) {
    		val = value;
    		this.key = key;
    	}
    }
    

      

    ps:

    存在并发问题。

  • 相关阅读:
    pandas_处理异常值缺失值重复值数据差分
    【C语言】输入10个人的成绩,求平均值
    【Markdown】新手快速入门基础教程
    【Python】 平方根
    【Python】 数字求和
    【Python】文件下载小助手
    【Python爬虫程序】抓取MM131美女图片,并将这些图片下载到本地指定文件夹。
    【Python】爬虫原理
    C语言最重要的知识点(电子文档)
    【Python】一些函数
  • 原文地址:https://www.cnblogs.com/huangfox/p/4316123.html
Copyright © 2011-2022 走看看