import java.util.*;
public class Solution {
public int[] LRU (int[][] operators, int k) {
//初始化LRU
LRUcache lrucache = new LRUcache(k);
//建立一个数组存放get值
List<Integer> list = new ArrayList<>();
for(int i = 0; i < operators.length; i ++){
//判断为1
if(operators[i][0] == 1){
lrucache.put(operators[i][1], operators[i][2]);
}else{
//为2时,放入数组
list.add(lrucache.get(operators[i][1]));
}
}
int[] arr = new int[list.size()];
for(int i = 0; i < list.size(); i++){
arr[i] = list.get(i);
}
return arr;
}
}
// 手写LRU缓存
class LRUcache{
// 全局
HashMap<Integer, Node> map;
DoubleLinkedList cache;
int cap;
public LRUcache(int capacity){
//定义一个HashMap
map = new HashMap<>();
//定义一个名字叫cache的双向链表
cache = new DoubleLinkedList();
//定义一个LRU容量
cap = capacity;
}
public void put(int key, int value){
Node newNode = new Node(key, value);
//如果map中已存在key
if(map.containsKey(key)){
//删除链表中key
cache.delete(map.get(key));
//将新key添加到链表头
cache.addFirst(newNode);
//将新节点放入map
map.put(key, newNode);
}else{
// 判断map是否达到容量
if(map.size() == cap){
//删除尾结点
map.remove(cache.deleteLast());
}
//链表中添加新节点至头部
cache.addFirst(newNode);
//map中添加该节点
map.put(key, newNode);
}
}
public int get(int key){
//判断map中是否有该节点
//map没有的话
if(!map.containsKey(key)) return -1;
//map中有该节点,更新一下该节点,让其放在链表头
int val = map.get(key).value;
put(key,val);
return val;
}
}
// 定义双向链表
class DoubleLinkedList{
Node head,tail;
public DoubleLinkedList(){
head = new Node(0, 0);
tail = new Node(0, 0);
head.next = tail;
tail.prev = head;
}
// 内部方法 将当前节点添加到链表头
public void addFirst(Node node){
node.next = head.next;
node.prev = head.next.prev;
head.next.prev = node;
head.next = node;
}
//内部方法 删除尾结点
public int deleteLast(){
if(head.next == tail) return -1;
return delete(tail.prev);
}
//内部方法 删除key为n的节点
public int delete(Node node){
int key = node.key;
node.prev.next = node.next;
node.next.prev = node.prev;
return key;
}
}
// 定义节点
class Node{
int key, value;
Node prev, next;
public Node(int key, int value){
this.key = key;
this.value = value;
}
}
public class Solution {
public int[] LRU (int[][] operators, int k) {
//初始化LRU
LRUcache lrucache = new LRUcache(k);
//建立一个数组存放get值
List<Integer> list = new ArrayList<>();
for(int i = 0; i < operators.length; i ++){
//判断为1
if(operators[i][0] == 1){
lrucache.put(operators[i][1], operators[i][2]);
}else{
//为2时,放入数组
list.add(lrucache.get(operators[i][1]));
}
}
int[] arr = new int[list.size()];
for(int i = 0; i < list.size(); i++){
arr[i] = list.get(i);
}
return arr;
}
}
// 手写LRU缓存
class LRUcache{
// 全局
HashMap<Integer, Node> map;
DoubleLinkedList cache;
int cap;
public LRUcache(int capacity){
//定义一个HashMap
map = new HashMap<>();
//定义一个名字叫cache的双向链表
cache = new DoubleLinkedList();
//定义一个LRU容量
cap = capacity;
}
public void put(int key, int value){
Node newNode = new Node(key, value);
//如果map中已存在key
if(map.containsKey(key)){
//删除链表中key
cache.delete(map.get(key));
//将新key添加到链表头
cache.addFirst(newNode);
//将新节点放入map
map.put(key, newNode);
}else{
// 判断map是否达到容量
if(map.size() == cap){
//删除尾结点
map.remove(cache.deleteLast());
}
//链表中添加新节点至头部
cache.addFirst(newNode);
//map中添加该节点
map.put(key, newNode);
}
}
public int get(int key){
//判断map中是否有该节点
//map没有的话
if(!map.containsKey(key)) return -1;
//map中有该节点,更新一下该节点,让其放在链表头
int val = map.get(key).value;
put(key,val);
return val;
}
}
// 定义双向链表
class DoubleLinkedList{
Node head,tail;
public DoubleLinkedList(){
head = new Node(0, 0);
tail = new Node(0, 0);
head.next = tail;
tail.prev = head;
}
// 内部方法 将当前节点添加到链表头
public void addFirst(Node node){
node.next = head.next;
node.prev = head.next.prev;
head.next.prev = node;
head.next = node;
}
//内部方法 删除尾结点
public int deleteLast(){
if(head.next == tail) return -1;
return delete(tail.prev);
}
//内部方法 删除key为n的节点
public int delete(Node node){
int key = node.key;
node.prev.next = node.next;
node.next.prev = node.prev;
return key;
}
}
// 定义节点
class Node{
int key, value;
Node prev, next;
public Node(int key, int value){
this.key = key;
this.value = value;
}
}