一、题目内容

image.png
image.png
image.png

二、题解

解法1:

思路

自己实现双向队列,map存key和value对象;
主要方法:
remove(Node)
addFirst(Node)

代码

  1. public class Solution_2 {
  2. class LRUNode {
  3. private int key;
  4. private int value;
  5. private LRUNode pre;
  6. private LRUNode next;
  7. public LRUNode() {
  8. }
  9. public LRUNode(int key, int value) {
  10. this.key = key;
  11. this.value = value;
  12. }
  13. }
  14. class LRUCache {
  15. private Map<Integer, LRUNode> cache = new HashMap<Integer, LRUNode>();
  16. private LRUNode dummyHead;
  17. private LRUNode dummyTail;
  18. private int capacity;
  19. private int size;
  20. public LRUCache() {
  21. }
  22. public LRUCache(int capcaity) {
  23. this.size = 0;
  24. this.capacity = capcaity;
  25. this.dummyHead = new LRUNode();
  26. this.dummyTail = new LRUNode();
  27. dummyHead.next = dummyTail;
  28. dummyTail.pre = dummyHead;
  29. }
  30. public void set(int key, int value) {
  31. LRUNode node = new LRUNode(key, value);
  32. if (cache.containsKey(key)) {
  33. node = cache.get(key);
  34. node.value = value;
  35. delete(node);
  36. addFirst(node);
  37. } else {
  38. if (size == capacity) {
  39. LRUNode last = dummyTail.pre;
  40. delete(last);
  41. cache.remove(last.key);
  42. size--;
  43. }
  44. addFirst(node);
  45. size++;
  46. }
  47. cache.put(key, node);
  48. }
  49. public int get(int key) {
  50. if (cache.containsKey(key)) {
  51. LRUNode node = cache.get(key);
  52. delete(node);
  53. addFirst(node);
  54. return node.value;
  55. } else {
  56. return -1;
  57. }
  58. }
  59. private void delete(LRUNode node) {
  60. node.pre.next = node.next;
  61. node.next.pre = node.pre;
  62. }
  63. private void addFirst(LRUNode node) {
  64. node.next = dummyHead.next;
  65. node.next.pre = node;
  66. dummyHead.next = node;
  67. node.pre = dummyHead;
  68. }
  69. }
  70. /**
  71. * lru design
  72. *
  73. * @param operators int整型二维数组 the ops
  74. * @param k int整型 the k
  75. * @return int整型一维数组
  76. */
  77. public int[] LRU(int[][] operators, int k) {
  78. List<Integer> list = new ArrayList<Integer>();
  79. LRUCache cache = new LRUCache(k);
  80. for (int[] operator : operators) {
  81. int operation = operator[0];
  82. int key = operator[1];
  83. if (operation == 1) {
  84. int value = operator[2];
  85. cache.set(key, value);
  86. } else {
  87. list.add(cache.get(key));
  88. }
  89. }
  90. int[] ans = new int[list.size()];
  91. for (int i = 0; i < list.size(); i++) {
  92. ans[i] = list.get(i);
  93. }
  94. return ans;
  95. }
  96. }