-
-
Notifications
You must be signed in to change notification settings - Fork 155
Expand file tree
/
Copy pathLRUCache.java
More file actions
142 lines (121 loc) · 3.03 KB
/
Copy pathLRUCache.java
File metadata and controls
142 lines (121 loc) · 3.03 KB
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
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
package leetcode.medium;
import leetcode.DoubleListNode;
import java.util.*;
/**
* Created by nikoo28 on 7/6/19 7:44 PM
*/
class LRUCache {
// Set<Integer> lru;
// final int maxCapacity;
// int ticks;
// HashMap<Integer, Integer> keyValPair;
// HashMap<Integer, Integer> valTicksPair;
//
// public LRUCache(int capacity) {
//
// lru = new HashSet<>();
// maxCapacity = capacity;
// ticks = 0;
// keyValPair = new HashMap<>(capacity);
// valTicksPair = new HashMap<>(capacity);
// }
//
// public int get(int key) {
//
// if (!lru.contains(key))
// return -1;
//
// ticks++;
// valTicksPair.put(key, ticks);
//
// return keyValPair.get(key);
// }
//
// public void put(int key, int value) {
//
// ticks++;
// if (lru.size() < maxCapacity) {
// lru.add(key);
// keyValPair.put(key, value);
// valTicksPair.put(key, ticks);
// return;
// }
//
// if (lru.contains(key)) {
// keyValPair.put(key, value);
// valTicksPair.put(key, ticks);
// return;
// }
//
// int leastUsed = Integer.MIN_VALUE;
// int minTicks = Integer.MAX_VALUE;
// for (Map.Entry<Integer, Integer> valTicks : valTicksPair.entrySet()) {
// if (valTicks.getValue() < minTicks) {
// minTicks = valTicks.getValue();
// leastUsed = valTicks.getKey();
// }
// }
//
// lru.remove(leastUsed);
// keyValPair.remove(leastUsed);
// valTicksPair.remove(leastUsed);
//
// lru.add(key);
// keyValPair.put(key, value);
// valTicksPair.put(key, ticks);
// }
private DoubleListNode head;
private DoubleListNode tail;
private Map<Integer, DoubleListNode> keyNodeAddressMap;
private int maxCapacity;
LRUCache(int capacity) {
head = new DoubleListNode();
tail = new DoubleListNode();
head.prev = null;
head.next = tail;
tail.next = null;
tail.prev = head;
keyNodeAddressMap = new HashMap<>(capacity);
maxCapacity = capacity;
}
int get(int key) {
if (!keyNodeAddressMap.containsKey(key))
return -1;
DoubleListNode node = keyNodeAddressMap.get(key);
moveToHead(node);
return node.val;
}
private void moveToHead(DoubleListNode node) {
removeNode(node);
addToHead(node);
}
void put(int key, int value) {
if (keyNodeAddressMap.containsKey(key)) {
DoubleListNode node = keyNodeAddressMap.get(key);
node.val = value;
moveToHead(node);
return;
}
DoubleListNode node = new DoubleListNode();
node.key = key;
node.val = value;
keyNodeAddressMap.put(key, node);
addToHead(node);
if (keyNodeAddressMap.size() > maxCapacity) {
keyNodeAddressMap.remove(tail.prev.key);
removeNode(tail.prev);
}
}
private void addToHead(DoubleListNode node) {
node.prev = head;
node.next = head.next;
head.next.prev = node;
head.next = node;
}
private void removeNode(DoubleListNode node) {
DoubleListNode prevNode = node.prev;
DoubleListNode nextNode = node.next;
prevNode.next = nextNode;
nextNode.prev = prevNode;
}
}