package Pta;
import java.util.*;
import java.util.Scanner;
import java.util.*;
public class match {
public static void main(String[] args) {
LRUCache lruCache=new LRUCache(3);
lruCache.put(1,2);
lruCache.put(2,3);
lruCache.put(3,4);
lruCache.put(1,9);
System.out.println(lruCache);
}
}
class LRUCache {
//哈希表的get put都是O(1)
//put get都算使用
int cap;
LinkedHashMap<Integer,Integer> lru=new LinkedHashMap();
public LRUCache(int capacity) {
this.cap=capacity;
}
public int get(int key) {
//没有的话返回-1
if(!lru.containsKey(key)){
return -1;
}
//有的话设置优先级,并且返回
int value=lru.get(key);
lru.remove(key);
lru.put(key,value);
return lru.get(key);
}
//linkedhashmap如果key相同插入的话
//会覆盖value并且保持原有顺序
//所以覆盖完先删除再插入一次就在链表尾部
public void put(int key, int value) {
if(lru.containsKey(key)){
//先覆盖
lru.put(key,value);
//再放入队尾
lru.remove(key);
lru.put(key,value);
return;
}
if(lru.size()>=this.cap){
int old=lru.keySet().iterator().next();
lru.remove(old);
}
lru.put(key,value);
}
@Override
public String toString() {
return "LRUCache{" +
"cap=" + cap +
", lru=" + lru +
'}';
}
}
O(1)时间复杂度实现LRU键值对插入删除
最新推荐文章于 2024-07-14 22:18:32 发布