#leetcode#LRU Cache
2015-07-22 08:51
471 查看
Design and implement a data structure for Least Recently Used (LRU) cache. It should support the following operations:
Get the value (will always be positive) of the key if the key exists in the cache, otherwise return -1.
When the cache reached its capacity, it should invalidate the least recently used item before inserting a new item.
分析: HashTable + DoublyLinkedList, LRU Cache中维护两个Node, first, last, 越靠近last的表示越least recently used,每次做get, set操作的时候,当前节点是 least recently used,
需要把他移动到LRU Cache中的last, 主要就是判断当前节点是否为first或者last,还有就是判断当前LRU的first/last 是否为null,学习了Code ganker大神的解法http://blog.csdn.net/linhuanmars/article/details/21310633, 看了思路之后自己试着写了个适合自己的版本
public class LRUCache {
class Node{
Node pre;
Node next;
int val;
int key;
public Node(int key, int val){
this.val = val;
this.key = key;
}
}
private int capacity;
private int num;
private Node first;
private Node last;
private Map<Integer, Node> map;
public LRUCache(int capacity) {
this.capacity = capacity;
this.num = 0;
this.map = new HashMap<Integer, Node>();
}
public int get(int key) {
Node node = map.get(key);
if(node == null){
return -1;
}
if(node != last){
if(node == first){
first = first.next;
if(first != null){
first.pre = null;
}
}else{
node.next.pre = node.pre;
node.pre.next = node.next;
}
last.next = node;
node.pre = last;
last = node;
node.next = null;
}
return node.val;
}
public void set(int key, int value) {
Node node = map.get(key);
if(node == null){
node = new Node(key, value);
map.put(key, node);// don't forget to add new entry for new key - node pair.
if(first == null){
first = node;
last = node;
num++;
}else{
if(num == capacity){
map.remove(first.key);// don't forget to delete map key
first = first.next;
if(first != null){
first.pre = null;
}
}else{
num++;
}
last.next = node;
node.pre = last;
last = node;
}
}else{
node.val = value;
if(node != last){
if(node == first){
first = first.next;
}else{
node.pre.next = node.next;
node.next.pre = node.pre;
}
last.next = node;
node.pre = last;
last = node;
}
}
}
}
getand
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.
分析: HashTable + DoublyLinkedList, LRU Cache中维护两个Node, first, last, 越靠近last的表示越least recently used,每次做get, set操作的时候,当前节点是 least recently used,
需要把他移动到LRU Cache中的last, 主要就是判断当前节点是否为first或者last,还有就是判断当前LRU的first/last 是否为null,学习了Code ganker大神的解法http://blog.csdn.net/linhuanmars/article/details/21310633, 看了思路之后自己试着写了个适合自己的版本
public class LRUCache {
class Node{
Node pre;
Node next;
int val;
int key;
public Node(int key, int val){
this.val = val;
this.key = key;
}
}
private int capacity;
private int num;
private Node first;
private Node last;
private Map<Integer, Node> map;
public LRUCache(int capacity) {
this.capacity = capacity;
this.num = 0;
this.map = new HashMap<Integer, Node>();
}
public int get(int key) {
Node node = map.get(key);
if(node == null){
return -1;
}
if(node != last){
if(node == first){
first = first.next;
if(first != null){
first.pre = null;
}
}else{
node.next.pre = node.pre;
node.pre.next = node.next;
}
last.next = node;
node.pre = last;
last = node;
node.next = null;
}
return node.val;
}
public void set(int key, int value) {
Node node = map.get(key);
if(node == null){
node = new Node(key, value);
map.put(key, node);// don't forget to add new entry for new key - node pair.
if(first == null){
first = node;
last = node;
num++;
}else{
if(num == capacity){
map.remove(first.key);// don't forget to delete map key
first = first.next;
if(first != null){
first.pre = null;
}
}else{
num++;
}
last.next = node;
node.pre = last;
last = node;
}
}else{
node.val = value;
if(node != last){
if(node == first){
first = first.next;
}else{
node.pre.next = node.next;
node.next.pre = node.pre;
}
last.next = node;
node.pre = last;
last = node;
}
}
}
}
相关文章推荐
- leetcode 179 Largest Number
- leetcode 24 Swap Nodes in Pairs
- leetcode 2 Add Two Numbers 方法1
- leetcode 2 Add Two Numbers 方法2
- [LeetCode]47 Permutations II
- [LeetCode]65 Valid Number
- [LeetCode]123 Best Time to Buy and Sell Stock III
- [LeetCode] String Reorder Distance Apart
- [LeetCode] Sliding Window Maximum
- [LeetCode] Find the k-th Smallest Element in the Union of Two Sorted Arrays
- [LeetCode] Determine If Two Rectangles Overlap
- [LeetCode] A Distance Maximizing Problem
- leetcode_linearList
- leetcode_linearList02
- LeetCode[Day 1] Two Sum 题解
- LeetCode[Day 2] Median of Two Sorted Arrays 题解
- LeetCode[Day 3] Longest Substring Without... 题解
- LeetCode [Day 4] Add Two Numbers 题解
- LeetCode [Day 5] Longest Palindromic Substring 题解
- LeetCode [Day 6] ZigZag Conversion 题解