Leetcode: LRU Cache 解题报告

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.

SOLUTION 1:

利用了JAVA 自带的LinkedHashMap ,其实这相当于作弊了,面试官不太可能会过。但是我们仍然可以练习一下如何使用LinkedHashMap.

同学们可以参考一下它的官方文档:

https://docs.oracle.com/javase/7/docs/api/java/util/LinkedHashMap.html#LinkedHashMap(int)

1. OverRide removeEldestEntry 函数,在Size达到最大值最,删除最长时间未访问的节点。

protected boolean removeEldestEntry(Map.Entry eldest) {

       return size() > capacity;

}

2. 在Get/ Set的时候,都更新节点,即删除之,再添加之,这样它会作为最新的节点加到双向链表中。

 1 package Algorithms.hash;
 2 
 3 import java.util.LinkedHashMap;
 4 import java.util.Map;
 5 
 6 public class LRUCache2 {
 7     public static void main(String[] strs) {
 8         LRUCache2 lrc2 = new LRUCache2(2);
 9         lrc2.set(1,3);
10         lrc2.set(2,2);
11         lrc2.set(1,4);
12         lrc2.set(4,2);
13         
14         System.out.println(lrc2.get(1));
15     }
16     
17     LinkedHashMap<Integer, Integer> map;
18     int capacity;
19     
20     public LRUCache2(final int capacity) {
21         // create a map.
22         map = new LinkedHashMap<Integer, Integer>(capacity) {
23             /**
24              * 
25              */
26             private static final long serialVersionUID = 1L;
27 
28             protected boolean removeEldestEntry(Map.Entry eldest) {
29                 return size() > capacity;
30             }
31         };
32         this.capacity = capacity;
33     }
34     
35     public int get(int key) {
36         Integer ret = map.get(key);
37         if (ret == null) {
38             return -1;
39         } else {
40             map.remove(key);
41             map.put(key, ret);
42         }
43         
44         return ret;
45     }
46     
47     public void set(int key, int value) {
48         map.remove(key);
49         map.put(key, value);
50     }
51 }
View Code

SOLUTION 2:

使用 HashMap+ 双向链表实现:

1. 如果需要移除老的节点,我们从头节点移除。

2. 如果某个节点被访问(SET/GET),将其移除并挂在双向链表的结尾。

3. 链表满了后,我们删除头节点。

4. 最近访问的节点在链尾。最久被访问的节点在链头。

View Code

 

请移步至主页君的GITHUB代码:

https://github.com/yuzhangcmu/LeetCode_algorithm/blob/master/hash/LRUCache.java

https://github.com/yuzhangcmu/LeetCode_algorithm/blob/master/hash/LRUCache2.java

 

---恢复内容结束---

郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。