Input
["LFUCache", "put", "put", "get", "put", "get", "get", "put", "get", "get", "get"]
[[2], [1, 1], [2, 2], [1], [3, 3], [2], [3], [4, 4], [1], [3], [4]]
Output
[null, null, null, 1, null, -1, 3, null, -1, 3, 4]
Explanation
lfu = LFUCache(2);
lfu.put(1, 1); // cache=[1,_], cnt(1)=1
lfu.put(2, 2); // cache=[2,1], cnt(2)=1, cnt(1)=1
lfu.get(1); // return 1, cache=[1,2], cnt(2)=1, cnt(1)=2
lfu.put(3, 3); // 2 is LFU (cnt=1 smallest), invalidate 2. cache=[3,1]
lfu.get(2); // return -1
lfu.get(3); // return 3, cnt(3)=2, cnt(1)=2
lfu.put(4, 4); // tie cnt 1 and 3, 1 is LRU, invalidate 1. cache=[4,3]
lfu.get(1); // return -1
lfu.get(3); // return 3, cnt(3)=3, cnt(4)=1
lfu.get(4); // return 4, cnt(4)=2, cnt(3)=3