遇到一道面试题,不使用map和set实现LRU,要求get的时间复杂度为O(logn),put的时间复杂度不超过O(n)。想到了用ArrayList来实现,保存有序的key。然而牵涉add节点,在保证有序的情况下通过插入排序在ArrayList中插入一个新节点,时间复杂度不能保证O(n),粗略写了一个代码,供大家提出一些建议。

class LRUCache {
class ListNode {
int key;
int val;
ListNode next;
ListNode pre;
public ListNode(int key, int val) {
this.key = key;
this.val = val;
next = null;
pre = null;
}
} private int capacity;
private List<ListNode> list;
private int getId;
private ListNode tail;
private ListNode head; public LRUCache(int k) {
capacity = k;
list = new ArrayList<>();
head = new ListNode(-1, -1);
tail = new ListNode(-1, -1);
head.next = tail;
tail.pre = head;
}
// 二分查找
public int search(int key) {
int left = 0, right = list.size() - 1;
while (left <= right) {
int mid = left + (right - left) / 2;
ListNode node = list.get(mid);
if (node.key > key) {
right = mid - 1;
} else if (node.key < key) {
left = mid + 1;
} else {
return mid;
}
}
return -1;
}
// get
public int get(int key) {
getId = search(key);
if (getId == -1) {
return getId;
}
ListNode node = list.get(getId);
node.pre.next = node.next;
node.next.pre = node.pre;
addToTail(node);
return node.val;
}
// put
public void put(int key, int val) {
if (get(key) != -1) {
list.get(getId).val = val;
return;
}
ListNode node = new ListNode(key, val);
addToTail(node);
int i = 0;
for (; i < list.size(); ++i) {
if (list.get(i).key > key) {
list.add(i, node); // 这里牵涉到get和add两个操作,不能保证put的时间复杂度为O(n)
break;
}
}
if (i == list.size()) list.add(node);
if (list.size() > capacity) {
getId = search(head.next.key);
list.remove(getId);
head.next = head.next.next;
head.next.pre = head;
}
} public void addToTail(ListNode node) {
node.pre = tail.pre;
node.next = tail;
node.pre.next = node;
tail.pre = node;
}
}

  

最新文章

  1. 第二章 centos安装maven
  2. 行业集中度(Concentration Ratio)
  3. 【翻译】How To Tango With Django 1.5.4 第二章
  4. 一个fibonacci数列简单求和的问题
  5. IS打包
  6. opencv + numpy for python
  7. 类加载器子系统——JVM之四
  8. 实现双8bit数据指定的位置0要么1
  9. Win7+QTP10.0+IE9无法启动IE的解决方法
  10. ASP.NET Aries 高级开发教程:Excel导入之多表高级导入配置(中)
  11. Linux 的基本命令
  12. ASP.NET MVC]WebAPI应用支持HTTPS的经验总结
  13. Testing - 软件测试知识梳理 - 相关词汇
  14. SQL小结
  15. 20161212xlVBA文本文件多列合并
  16. JDK1.8最新特性--Lambda表达式(重点)
  17. HTML中的figure和gigcaption标签
  18. 利用APT实现Android编译时注解
  19. 项目--uml
  20. #iOS问题记录# UIWebView滑动到底部

热门文章

  1. HttpServletResponse的学习
  2. 【uva 1349】Optimal Bus Route Design(图论--网络流 二分图的最小权完美匹配)
  3. hdu 5316 Magician 线段树维护最大值
  4. Codeforces Round #672 (Div. 2) A. Cubes Sorting (思维)
  5. servlet接口实现类HttpServlet以及开发中一些细节
  6. Codeforces Global Round 9 B. Neighbor Grid (构造,贪心)
  7. 牛客算法周周练20 F.紫魔法师 (二分图染色)
  8. 微信小程序swiper实现 句子控app首页滑动卡片
  9. scu-4440 rectangle (非原创)
  10. Leetcode(27)-移除元素