Monday, July 28, 2014

[LeetCode] 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.

解题思路:
1. 要求每次查询元素要constant-time,则我们想到要用hashmap
2. 要每次能返回least recently used cache, 则我们想到要用queue或者linkedlist
则合起来则用linkedhahsmap

注意:每次get, 或者set都要把已经存在的此元素挪到后面去,因为这些操作为调用了cache

Java Code:
 public class LRUCache {
    
   private int totalCapacity;
    LinkedHashMap linkedHashMap = new LinkedHashMap();
    private int num;
    
    public LRUCache(int capacity){
           this.totalCapacity = capacity;
           this.num = 0;
    }
    
    public int get(int key){
        int value = -1;
        if (linkedHashMap.containsKey(key)){
            value = linkedHashMap.get(key);
            linkedHashMap.remove(key);
            linkedHashMap.put(key, value);
         }
         
         return value;
    }
    public void set(int key, int value){
        if (linkedHashMap.containsKey(key)){
            linkedHashMap.remove(key);
            linkedHashMap.put(key, value);
            return;
        }
        
        if(this.num == this.totalCapacity){  
           Iterator keys= linkedHashMap.keySet().iterator();           
           linkedHashMap.remove(keys.next()); 
           this.num--;
        }
        
        this.num++;
        
        linkedHashMap.put(key, value);
    }
    
}

No comments:

Post a Comment