博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
LeetCode – LRU Cache (Java)
阅读量:5889 次
发布时间:2019-06-19

本文共 2276 字,大约阅读时间需要 7 分钟。

Problem

Design and implement a data structure for Least Recently Used (LRU) cache. It should support the following operations: get and set.

get(key) - Get the value (will always be positive) of the key if the key exists in the cache, otherwise return -1.

set(key, value) - Set or insert the value if the key is not already present. When the cache reached its capacity, it should invalidate the least recently used item before inserting a new item.

Java Solution

The key to solve this problem is using a double linked list which enables us to quickly move nodes.

 

import java.util.HashMap; public class LRUCache {	private HashMap
map = new HashMap
(); private DoubleLinkedListNode head; private DoubleLinkedListNode end; private int capacity; private int len; public LRUCache(int capacity) { this.capacity = capacity; len = 0; } public int get(int key) { if (map.containsKey(key)) { DoubleLinkedListNode latest = map.get(key); removeNode(latest); setHead(latest); return latest.val; } else { return -1; } } public void removeNode(DoubleLinkedListNode node) { DoubleLinkedListNode cur = node; DoubleLinkedListNode pre = cur.pre; DoubleLinkedListNode post = cur.next; if (pre != null) { pre.next = post; } else { head = post; } if (post != null) { post.pre = pre; } else { end = pre; } } public void setHead(DoubleLinkedListNode node) { node.next = head; node.pre = null; if (head != null) { head.pre = node; } head = node; if (end == null) { end = node; } } public void set(int key, int value) { if (map.containsKey(key)) { DoubleLinkedListNode oldNode = map.get(key); oldNode.val = value; removeNode(oldNode); setHead(oldNode); } else { DoubleLinkedListNode newNode = new DoubleLinkedListNode(key, value); if (len < capacity) { setHead(newNode); map.put(key, newNode); len++; } else { map.remove(end.key); end = end.pre; if (end != null) { end.next = null; } setHead(newNode); map.put(key, newNode); } } }} class DoubleLinkedListNode { public int val; public int key; public DoubleLinkedListNode pre; public DoubleLinkedListNode next; public DoubleLinkedListNode(int key, int value) { val = value; this.key = key; }}

  

ps:

存在并发问题。

转载地址:http://oufsx.baihongyu.com/

你可能感兴趣的文章
修改注册表防止SYN淹没式攻击
查看>>
WinForm窗体缩放动画
查看>>
Memcached 安装及启动脚本
查看>>
Net设计模式实例之适配器模式(Adapter Pattern)
查看>>
ABP理论学习之多租户
查看>>
Neutron 理解 (8): Neutron 是如何实现虚机防火墙的 [How Neutron Implements Security Group]...
查看>>
TP-Link wr703N 使用华为HiLink系列上网卡的设置【转】
查看>>
ASP.NET MVC5+EF6+EasyUI 后台管理系统(4)-创建项目解决方案
查看>>
IBM云的商务动作之我见(2):IBM 和 VMware 战略合作推进混合云
查看>>
阿里云--域名,主机,备案都配置好了,就是不能访问网站的解决方案
查看>>
使用Enyim.Caching访问阿里云的OCS
查看>>
使用SQLServer同义词和SQL邮件,解决发布订阅中订阅库丢失数据的问题
查看>>
预付费转码时长包
查看>>
r语言 连接 oracle数据库
查看>>
自然语言处理工具LTP语言云调用方法
查看>>
ARM Linux 3.x的设备树(Device Tree)【转】
查看>>
对 makefile 中 eval 函数的学习体会
查看>>
可拖动的层DIV的完整源代码【转】
查看>>
ASP.NET 常见问题 和 网页上加上百度搜索
查看>>
英国脱欧不过是小事一桩
查看>>