leetcode第2044题LRU缓存
设计和构建一个“最近最少使用”缓存,该缓存会删除最近最少使用的项目。缓存应该从键映射到值(允许你插入和检索特定键对应的值),并在初始化时指定最大容量。当缓存被填满时,它应该删除最近最少使用的项目。
它应该支持以下操作: 获取数据 get 和 写入数据 put 。
获取数据 get(key) - 如果密钥 (key) 存在于缓存中,则获取密钥的值(总是正数),否则返回 -1。
写入数据 put(key, value) - 如果密钥不存在,则写入其数据值。当缓存容量达到上限时,它应该在写入新数据之前删除最近最少使用的数据值,从而为新的数据值留出空间。
class LRUCache {
public static class LinkedLRUHashMap<K,V> extends LinkedHashMap<K,V>{
private int capacity;
public LinkedLRUHashMap(int capacity) {
super(capacity,0.75f,true);
this.capacity = capacity;
}
@Override
protected boolean removeEldestEntry(Map.Entry<K,V> eldest){
return size() > capacity;
}
}
private LinkedLRUHashMap<Integer,Integer> cacheMap;
public LRUCache(int capacity) {
cacheMap = new LinkedLRUHashMap(capacity);
}
public int get(int key) {
Integer val = cacheMap.get(key);
if (val != null) {
return val;
}
return -1;
}
public void put(int key, int value) {
cacheMap.put(key, value);
}
}
leetcode第1960题二叉树的最近公共祖先
class Solution {
private Map<Integer, TreeNode> parent = new HashMap<>();
private Set<Integer> set = new HashSet<>();
public TreeNode lowestCommonAncestor(TreeNode root, TreeNode p, TreeNode q) {
saveChildAndParent(root);
//从保存的子父类节点的映射关系中找到所有p的父类的节点 并保存到set中
while (p != null) {
set.add(p.val);
p = parent.get(p.val);
}
while (q != null) {
if (set.contains(q.val)) {
return q;
}
q=parent.get(q.val);
}
return null;
}
//将每一个子节点和父节点保存到 parent中
private void saveChildAndParent(TreeNode root) {
if (root.left != null) {
parent.put(root.left.val, root);
saveChildAndParent(root.left);
}
if (root.right != null) {
parent.put(root.right.val, root);
saveChildAndParent(root.right);
}
}
}