forked from rampatra/Algorithms-and-Data-Structures-in-Java
-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathLRUCache.java
61 lines (53 loc) · 1.78 KB
/
LRUCache.java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
package com.leetcode.design;
import java.util.LinkedHashMap;
import java.util.Map;
import static org.junit.jupiter.api.Assertions.assertEquals;
/**
* Level: Medium
* Link: https://leetcode.com/problems/lru-cache/
* Description:
* Design and implement a data structure for Least Recently Used (LRU) cache. It should support the following
* operations: get and put.
*
* get(key) - Get the value (will always be positive) of the key if the key exists in the cache, otherwise return -1.
* put(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.
*
* The cache is initialized with a positive capacity.
*
* Follow up:
* Could you do both operations in O(1) time complexity?
*
* Runtime: <a href="https://leetcode.com/submissions/detail/253383205/">54 ms</a>.
*
* @author rampatra
* @since 2019-08-20
*/
public class LRUCache {
private LinkedHashMap<Integer, Integer> cache;
public LRUCache(int capacity) {
this.cache = new LinkedHashMap<Integer, Integer>(capacity, 0.75f, true) {
@Override
protected boolean removeEldestEntry(Map.Entry eldest) {
return size() > capacity;
}
};
}
public int get(int key) {
Integer val = cache.get(key);
return val == null ? -1 : val;
}
public void put(int key, int value) {
cache.put(key, value);
}
public static void main(String[] args) {
LRUCache cache = new LRUCache(2);
cache.put(1,1);
cache.put(2,2);
cache.put(1,1);
cache.put(3,3);
assertEquals(1, cache.get(1));
assertEquals(-1, cache.get(2));
assertEquals(3, cache.get(3));
}
}