一、题目内容

image.png

二、题解

解法1:

思路

代码

  1. public class Solution {
  2. public int[] LFU (int[][] operators, int k) {
  3. // write code here
  4. List<Integer> ansList = new ArrayList<Integer>();
  5. LFUCache cache = new LFUCache(k);
  6. for(int[] operator: operators){
  7. int operation = operator[0];
  8. int key = operator[1];
  9. if(operation == 1){
  10. cache.set(key,operator[2]);
  11. }else if(operation == 2){
  12. ansList.add(cache.get(key));
  13. }
  14. }
  15. int[] ans = new int[ansList.size()];
  16. for(int i = 0;i<ansList.size();i++){
  17. ans[i] = ansList.get(i);
  18. }
  19. return ans;
  20. }
  21. //-------LFUCache------------------------------//
  22. class LFUCache{
  23. Map<Integer,Bucket> cacheMap = new HashMap<Integer,Bucket>();
  24. Bucket head,tail;
  25. int cap;
  26. int size;
  27. public LFUCache(int cap){
  28. this.cap = cap;
  29. size = 0;
  30. head = new Bucket(-1);
  31. tail = new Bucket(-1);
  32. head.next = tail;
  33. tail.pre = head;
  34. }
  35. public int get(int key){
  36. if(cacheMap.containsKey(key)){
  37. Bucket cur = cacheMap.get(key);
  38. Bucket target = null;
  39. //建新桶
  40. if(cur.next.idx != cur.idx+1){
  41. target = new Bucket(cur.next.idx+1);
  42. target.pre = cur;
  43. target.next = cur.next;
  44. cur.next.pre = target;
  45. cur.next = target;
  46. }else{
  47. target = cur.next;
  48. }
  49. Item remove = cur.remove(key);
  50. target.put(remove.key,remove.value);
  51. cacheMap.put(key,target);
  52. //清空 空桶
  53. deleteIfEmpty(cur);
  54. return remove.value;
  55. }
  56. return -1;
  57. }
  58. public void set(int key,int value){
  59. if(cap == 0){
  60. return;
  61. }
  62. if(cacheMap.containsKey(key)){
  63. Bucket cur = cacheMap.get(key);
  64. cur.put(key,value);
  65. get(key);//idx+1
  66. }else{
  67. //满,移除
  68. if(size == cap){
  69. Bucket cur = head.next;
  70. Item item = cur.clearLast();
  71. cacheMap.remove(item.key);
  72. size--;
  73. deleteIfEmpty(cur);
  74. }else{
  75. Bucket first = null;
  76. //新建1号桶
  77. if(head.next.idx!=1){
  78. first = new Bucket(1);
  79. first.next = head.next;
  80. first.pre = head;
  81. head.next.pre = first;
  82. head.next = first;
  83. }else{
  84. first = head.next;
  85. }
  86. first.put(key,value);
  87. cacheMap.put(key,first);
  88. size++;
  89. }
  90. }
  91. }
  92. void deleteIfEmpty(Bucket cur){
  93. if(cur.isEmpty()){
  94. cur.pre.next = cur.next;
  95. cur.next.pre = cur.pre;
  96. cur = null;
  97. }
  98. }
  99. }
  100. //------Item, Bucket------------------------//
  101. class Item{
  102. Item pre,next;
  103. int key,value;
  104. public Item(int k,int v){
  105. this.key = k;
  106. this.value = v;
  107. }
  108. }
  109. class Bucket{
  110. Bucket pre,next;
  111. int idx;
  112. Item head,tail;
  113. Map<Integer,Item> dic = new HashMap<Integer,Item>();
  114. public Bucket(int idx) {
  115. this.idx = idx;
  116. head = new Item(-1, -1);
  117. tail = new Item(-1, -1);
  118. head.next = tail;
  119. tail.pre = head;
  120. }
  121. void put(int key,int value){
  122. Item item = null;
  123. if(dic.containsKey(key)){
  124. item = dic.get(key);
  125. item.value = value;
  126. //移除
  127. item.pre.next = item.next;
  128. item.next.pre = item.pre;
  129. }else{
  130. item = new Item(key,value);
  131. dic.put(key,item);
  132. }
  133. item.next = head.next;
  134. item.pre = head;
  135. head.next.pre = item;
  136. head.next = item;
  137. }
  138. Item remove(int key){
  139. if(dic.containsKey(key)){
  140. Item item = dic.get(key);
  141. item.pre.next = item.next;
  142. item.next.pre = item.pre;
  143. dic.remove(key);
  144. return item;
  145. }
  146. return null;
  147. }
  148. Item clearLast(){
  149. Item item = tail.pre;
  150. item.pre.next = item.next;
  151. item.next.pre = item.pre;
  152. dic.remove(item.key);
  153. return item;
  154. }
  155. boolean isEmpty(){
  156. return dic.size() == 0;
  157. }
  158. }
  159. }