《leetcode》: LRU Cache
2016-07-20 17:23
302 查看
题目
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.
思路:超时
借用一个Map和List来完成,List得作用就是将每次操作的key放在最前面。这样,当满的时候,List的最后一个元素就是很久没有被使用过的,其对应的(key,value)应该在map中被删除。但是这种方式不能AC,报超时,能优化的地方都进行了优化还是不行。
实现代码如下:
public class LRUCache { private Map<Integer,Integer> map = null; private List<Integer> list = new ArrayList<Integer>(); private int totalSize; public LRUCache(int capacity) { map = new HashMap<Integer,Integer>(capacity); totalSize = capacity; } public int get(int key) { if(map.containsKey(key)){ //将key放在最前面 //由于list的remove方法中的参数是索引下标 remove(key); list.add(0, key); return map.get(key); } return -1; } public void set(int key, int value) { int mapSize = map.size(); boolean b_Contain = map.containsKey(key); if(mapSize<totalSize&&!b_Contain){ map.put(key, value); } else if(mapSize<=totalSize&&b_Contain){ map.put(key, value); //把key放在最前面 remove(key); } else if(mapSize==totalSize&&!b_Contain){ Integer k = list.get(list.size()-1); //先在Map中删除最久没有使用的 map.remove(k, map.get(k)); map.put(key, value); //list.remove(k); remove(k); } //将key放在最前面 list.add(0, key); } private void remove(Integer k) { int len = list.size(); for(int i=0;i<len;i++){ if(k.equals(list.get(i))){ list.remove(i); break; } } } }
因此需要寻找更好的方法。
相关文章推荐
- Fragment在inflate时的注意事项
- Mysql cluster集群的搭建
- 4-1 单链表逆转 (20分)
- 2016multi-university1005 KM算法
- win7下64bit,运行libsvm2.90中setup.py时出现unable to find vcvarsall.bat 的解决方法
- python 笔记
- UML 类图
- 图片转换为字节流,字节流转换为图片
- 折线分割平面 hd 2050
- BlockingQueue
- 基本UDP套接字编程
- 数据类型所佔用内存大小
- Java实现 二叉搜索树算法(BST)
- hdoj4548美素数(素数打表,易超时)
- 【日常练习】Prime Ring Problem(素数环)
- Photon Server笔记1:启动MMO Demo 2016/07/20
- 一个界面使用两个tableView
- 使用GCC和CMake编译OpenCV
- [转]进程创建-终结流程图
- Codeforces Round #305 (Div. 2) C 循环节