首页 > 系统服务 > 详细

Leetcode- LRUCache

时间:2014-10-18 12:37:26      阅读:314      评论:0      收藏:0      [点我收藏+]

关键是搞懂题目(不知道LRUCache的只能自己google了)。

然后用双向链表来模拟cache被get和set。但是naive implementation会exceed time limit。所以最大的关键是用一个HashMap来记录key在链表中的位置,这样子每次查询是O(1)的时间,否则O(n)。

这个也是很经典的用Map来加速双向链表查询的思路(前提是key要唯一)。


import java.util.*;

public class LRUCache {

	Map<Integer, DoubleLinkedListNode> hmap = new HashMap<Integer, DoubleLinkedListNode>();
	DoubleLinkedListNode head = null;
	DoubleLinkedListNode tail = null;
	int capa;

	public LRUCache(int capacity) {
		this.capa = capacity;
	}

	public int get(int key) {

		if (hmap.containsKey(key)) {
			DoubleLinkedListNode tnode = hmap.get(key);
			tnode = removeNode(tnode);
			pushFront(tnode);
			return tnode.value;
		}
		return -1;
	}

	public void set(int key, int value) {

		if (hmap.containsKey(key) == true) {

			DoubleLinkedListNode tnode = hmap.get(key);
			tnode.value = value;
			tnode = removeNode(tnode);

			pushFront(tnode);
		}

		else {
			DoubleLinkedListNode newNode = new DoubleLinkedListNode(key,value);

			if (hmap.size() == capa) {
				hmap.remove(tail.key);
				removeNode(tail);
			}

			pushFront(newNode);
			hmap.put(key, newNode);
		}
	}

	void pushFront(DoubleLinkedListNode node) {
		if (head == null) {
			head = tail = node;
		} else {
			node.next = head;
			head.prev = node;
			head = node;
		}
		return;
	}

	DoubleLinkedListNode removeNode(DoubleLinkedListNode node) {
		DoubleLinkedListNode prev = node.prev;
		DoubleLinkedListNode next = node.next;

		if (prev != null) {
			prev.next = next;
		} else {
			head = next;
		}

		if (next != null) {
			next.prev = prev;
		} else {
			tail = prev;
		}

		node.prev = null;
		node.next = null;

		return node;
	}

	class DoubleLinkedListNode {
		int key;
		int value;
		DoubleLinkedListNode prev;
		DoubleLinkedListNode next;

		public DoubleLinkedListNode(int key, int val) {
			this.key = key;
			this.value = val;
			prev = null;
			next = null;
		}

		public DoubleLinkedListNode() {
			value = 0;
			prev = null;
			next = null;
		}
	}
	

}


Leetcode- LRUCache

原文:http://blog.csdn.net/tspatial_thunder/article/details/40210265

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!