本来想用PriorityQueue,结果超时了,改用俩LinkedHashMap 去存value 和 frequency了。不过代码里还保留了PriorityQueue 的用法,回头看看怎么改进一下时间复杂度。

import java.util.*;
public class Solution {

    public int[] LFU (int[][] operators, int k) {
        // write code here
        if(operators==null||operators.length==0||k<1) return new int[] {-1};
        ArrayList<Integer> res = new ArrayList<>();
        LinkedHashMap<Integer, Integer> map = new LinkedHashMap<>();
        LinkedHashMap<Integer, Integer> count = new LinkedHashMap<>();
        PriorityQueue<Node> queue = new PriorityQueue<Node>(new Comparator<Node>(){
            public int compare(Node n1, Node n2){
                return n1.frequency - n2.frequency;
            }
        });
        for(int[] op : operators){
            int key = op[1];
            switch(op[0]){
                case 1:
                    if(!map.containsKey(key)){
                        if(map.size()==k){
                            //Node least = queue.poll();
                            //map.remove(least.frequency);
                            int leastkey = getLeast(count);
                            map.remove(leastkey);
                            count.remove(leastkey);
                        }
                        map.put(key,op[2]);
                        count.put(key,1);
                        //Node cur = new Node(key,1);
                        //queue.offer(cur);
                    }else{
                        map.remove(key);
                        map.put(key,op[2]);
                        int fre = count.get(key);
                        count.remove(key);
                        count.put(key,fre+1);
                        //update(queue,key);
                    }
                    break;
                case 2:
                    if(map.containsKey(key)){
                        int value = map.get(key);
                        res.add(value);
                        int fre = count.get(key);
                        count.remove(key);
                        count.put(key,fre+1);
                        //update(queue,key);
                    }else{
                        res.add(-1);
                    }
                    break;
                default:
            }
        }
        return res.stream().mapToInt(Integer::intValue).toArray();
    }

    public int getLeast(LinkedHashMap<Integer,Integer> count){
        int min = Integer.MAX_VALUE;
        int key = 0;
        Set<Integer> keyset = count.keySet();
        for(int i : keyset){
            if(count.get(i)<min){
                min = count.get(i);
                key = i;
            }
        }
        return key;
    }

    public void update(Queue<Node> queue, int key){
        Stack<Node> stack = new Stack<Node>();
        while(!queue.isEmpty()){
            Node cur = queue.poll();
            if(cur.key!=key){
                stack.push(cur);
            }else{
                cur.frequency+=1;
                queue.offer(cur);
                break;
            }
        }
        while(!stack.isEmpty()){
            queue.offer(stack.pop());
        }
    }
}

class Node{
    public int key;
    public int frequency;

    public Node(int key, int fre){
        this.key = key;
        this.frequency = fre;
    }
}