这题其实跟LRU半斤八两:
import java.util.*;
public class Solution {
/**
* lfu design
* @param operators int整型二维数组 ops
* @param k int整型 the k
* @return int整型一维数组
*/
public int[] LFU (int[][] operators, int k) {
// write code here
ArrayList<Integer> list = new ArrayList<>();
// int[] 是一个长度为3的数组,第一个元素用来存储value,第二个元素用来存储访问次数
//,第三个元素记录上次调用的时间
HashMap<Integer, int[]> map = new HashMap<>();
int counter = 0; // 计时器
for (int[] operator : operators) {
if (operator[0] == 1) {
if (!map.containsKey(operator[1])) {
// 如果size等于k, 就要删除一个元素, 此处可以独立出来写一个函数
if (map.size() == k) {
int rm = 0;
int min = Integer.MAX_VALUE;
for (Map.Entry<Integer, int[]> entry : map.entrySet()) {
if (min > entry.getValue()[1]) {
rm = entry.getKey();
min = entry.getValue()[1];
} else {
if (entry.getValue()[1] == min) {
if (entry.getValue()[2] < map.get(rm)[2]) {
rm = entry.getKey();
}
}
}
}
map.remove(rm);
}
map.put(operator[1], new int[] {operator[2], 1, counter++});
} else {
map.put(operator[1], new int[] {operator[2], map.get(operator[1])[1] + 1, counter++});
}
} else {
if (map.containsKey(operator[1])) {
list.add(map.get(operator[1])[0]);
map.get(operator[1])[1]++;
map.get(operator[1])[2] = counter++;
} else {
list.add(-1);
}
}
}
int[] res = new int[list.size()];
for (int i = 0; i < list.size(); i++) {
res[i] = list.get(i);
}
return res;
}
}
京公网安备 11010502036488号