题目大意:模拟LRU算法,实现get(key)和set(key,value)两个功能
这道题做了有很久了,具体实现细节不好说,但用的是链表模拟cache,而我用的链表是用数组实现的静态链表,所以在节点的移动,增删方面有些细节需要斟酌
下面是AC代码
struct node{
int key,value,next,pre;
};
class LRUCache{
public:
struct node arrymap[9050];
map<int ,int > myindex;
int bufsize;
int size,flag;
int head,tail;
int index;
LRUCache(int capacity) {
bufsize=capacity;
myindex.clear();
head=tail=size=0;
}
int get(int key) {
if(myindex.count(key)>0)
flag=myindex[key];
else
return -1;
if(flag==head)
return arrymap[head].value;
if(size>2)
{
if(flag!=tail)
{
arrymap[arrymap[flag].pre].next=arrymap[flag].next;
arrymap[arrymap[flag].next].pre=arrymap[flag].pre;
arrymap[flag].pre=tail;
arrymap[flag].next=head;
arrymap[head].pre=flag;
arrymap[tail].next=flag;
head=flag;
}else
{
tail=arrymap[flag].pre;
head=flag;
}
return arrymap[head].value;
}else
{
tail=head;
head=flag;
return arrymap[flag].value;
}
}
void set(int key, int value) {
if(size==0)
{
head=1;tail=1;size++;
arrymap[size].key=key;
arrymap[size].value=value;
arrymap[size].next=size;
arrymap[size].pre=size;
myindex.insert(pair<int,int>(key,size));
}else if(size<bufsize)
{
if(get(key)!=-1)
{
arrymap[head].value=value;
}
else
{
size++;
arrymap[size].key=key;
arrymap[size].value=value;
arrymap[size].next=head;
arrymap[size].pre=tail;
arrymap[head].pre=size;
arrymap[tail].next=size;
myindex.insert(pair<int,int>(key,size));
head=size;
};
}else
{
if(get(key)!=-1)
{
arrymap[head].value=value;
}else
{
if(size>2)
{
myindex.erase(myindex.find(arrymap[tail].key));
myindex.insert(pair<int,int>(key,tail));
arrymap[tail].next=head;
arrymap[tail].value=value;
arrymap[tail].key=key;
arrymap[head].pre=tail;
head=tail;
tail=arrymap[tail].pre;
arrymap[tail].next=head;
arrymap[head].pre=tail;
}else
{
myindex.erase(myindex.find(arrymap[tail].key));
flag=tail;
tail=head;
arrymap[flag].key=key;
arrymap[flag].value=value;
head=flag;
myindex.insert(pair<int,int>(key,head));
}
};
}
}
};