当前位置:   article > 正文

经典算法面试题:LRU缓存_算法题lru

算法题lru

题目

设计和构建一个“最近最少使用”缓存,该缓存会删除最近最少使用的项目。缓存应该从键映射到值(允许你插入和检索特定键对应的值),并在初始化时指定最大容量。当缓存被填满时,它应该删除最近最少使用的项目。

它应该支持以下操作: 获取数据 get 和 写入数据 put 。

获取数据 get(key) - 如果密钥 (key) 存在于缓存中,则获取密钥的值(总是正数),否则返回 -1。
写入数据 put(key, value) - 如果密钥不存在,则写入其数据值。当缓存容量达到上限时,它应该在写入新数据之前删除最近最少使用的数据值,从而为新的数据值留出空间。

示例:

LRUCache cache = new LRUCache( 2 /* 缓存容量 */ );

cache.put(1, 1);
cache.put(2, 2);
cache.get(1);       // 返回  1
cache.put(3, 3);    // 该操作会使得密钥 2 作废
cache.get(2);       // 返回 -1 (未找到)
cache.put(4, 4);    // 该操作会使得密钥 1 作废
cache.get(1);       // 返回 -1 (未找到)
cache.get(3);       // 返回  3
cache.get(4);       // 返回  4

思路

hash+双向链表

实现

  1. class LRUCache {
  2. class ListNode{
  3. int key;
  4. int val;
  5. ListNode pre;
  6. ListNode next;
  7. public ListNode(){};
  8. public ListNode(int key, int val){
  9. this.key = key;
  10. this.val = val;
  11. }
  12. }
  13. Map<Integer, ListNode> map = new HashMap<>();
  14. ListNode head;
  15. ListNode tail;
  16. int size;
  17. int capacity;
  18. public LRUCache(int capacity) {
  19. this.size = 0;
  20. this.capacity = capacity;
  21. head = new ListNode();
  22. tail = new ListNode();
  23. head.next = tail;
  24. tail.pre = head;
  25. }
  26. public int get(int key) {
  27. ListNode tmp = map.get(key);
  28. if (tmp == null) return -1;
  29. moveToHead(tmp);
  30. return tmp.val;
  31. }
  32. private void moveToHead(ListNode node){
  33. remove(node);
  34. add(node);
  35. }
  36. private void remove(ListNode node){
  37. node.pre.next = node.next;
  38. node.next.pre = node.pre;
  39. }
  40. private void add(ListNode node){
  41. node.pre = head;
  42. node.next = head.next;
  43. head.next.pre = node;
  44. head.next = node;
  45. }
  46. public void put(int key, int value) {
  47. ListNode tmp = map.get(key);
  48. if (tmp == null){
  49. ListNode node = new ListNode(key, value);
  50. map.put(key, node);
  51. add(node);
  52. size++;
  53. if (size > capacity){
  54. ListNode del = tail.pre;
  55. int removedel = del.key;
  56. map.remove(removedel);
  57. remove(del);
  58. }
  59. }else{
  60. tmp.val = value;
  61. moveToHead(tmp);
  62. }
  63. }
  64. }

 

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/小小林熬夜学编程/article/detail/519389
推荐阅读
相关标签
  

闽ICP备14008679号