思路
这道算法题本质是模拟,模拟一个过程,可以说思路比较简单,不过实现过程有点复杂
首先就是数据结构的选择,LRU算法需要一个链表来实现,而题目要求时间复杂度为常数级,那么我们就要用到哈希表,哈希表我们可以选择数组来实现,也可以选择用java封装好的HashSet或HashMap,由于这道题需要用到链表,那么封装好的HashMap难以实现链表功能。那么我们可以选择封装好的LinkedHashMap,也可以自己实现一个LinkedHashMap;
数据结构的进一步思考:链表我们用单向还是双向的?由于我们要在常数级删除一个节点,那么我们除了要在常数级找到他,还得在常数级删除他,这里显然需要用双向链表来实现快速删除,这里我们维护两个额外的节点,哑结点(头结点)和尾结点,统一插入和删除操作。
除此之外,我们还要明确对应的属性是属于哪个类,例如最大容量和当前容量便是属于LRUCache类,哑结点和尾结点也是LRUCache类
伪代码(主要表示思路)
class Node {
int key;
int value;
Node before;
Node next;
Node(){
}
Node(int key,int value,Node before,Node next){
//
this.key = key;
this.value = value;
this.before = before;
this.next = next;
}
}
class LRUCache {
int capacity;
Node dummy;
Node tail;
int curNum;
Node[] hash;
public LRUCache(int capacity) {
hash = new Node[10001];
this.capacity = capacity;
this.dummy = new Node(-1,-1,null,null);
this.tail = new Node(