import java.util.*; public class Solution { /** * lfu design * @param operators int整型二维数组 ops * @param k int整型 the k * @return int整型一维数组 */ HashMap<Integer,Integer> keyToValue; HashMap<Integer,Integer> keyToFreq; HashMap<Integer,LinkedHashSet<Integer>> freqToKeys; int minFreq; int cap; public int[] LFU (int[][] operators, int k) { // write code here ArrayList<Integer> resList = new ArrayList<>(); keyToValue = new HashMap<>(); keyToFreq = new HashMap<>(); freqToKeys = new HashMap<>(); minFreq = 0; cap = k; int m = operators.length; for(int i=0;i<m;i++){ if(operators[i][0] == 1){ put(operators[i][1],operators[i][2]); }else{ int res = get(operators[i][1]); resList.add(res); } } int l = resList.size(); int[] resArr = new int[l]; for(int i = 0;i<l;i++){ resArr[i] = resList.get(i); } return resArr; } public int get(int key){ if(!keyToValue.containsKey(key)){ return -1; } increFreq(key); return keyToValue.get(key); } private void increFreq(int key){ int freq = keyToFreq.get(key); keyToFreq.put(key,freq+1); freqToKeys.get(freq).remove(key); freqToKeys.putIfAbsent(freq+1,new LinkedHashSet<Integer>()); freqToKeys.get(freq+1).add(key); if(freqToKeys.get(freq).isEmpty()){ freqToKeys.remove(freq); if(freq == this.minFreq){ this.minFreq++; } } } public void put(int key,int value){ if(this.cap <= 0) return; if(keyToValue.containsKey(key)){ keyToValue.put(key,value); increFreq(key); return; }else{ if(this.cap <= keyToValue.size()){ removeMinFreqKey(); } keyToValue.put(key,value); keyToFreq.put(key,1); freqToKeys.putIfAbsent(1,new LinkedHashSet<>()); freqToKeys.get(1).add(key); this.minFreq = 1; } } private void removeMinFreqKey(){ LinkedHashSet<Integer> keyList = freqToKeys.get(this.minFreq); int deleteKey = keyList.iterator().next(); keyList.remove(deleteKey); if(keyList.isEmpty()){ freqToKeys.remove(this.minFreq); } keyToValue.remove(deleteKey); keyToFreq.remove(deleteKey); } }