Implement LRU cache, and count the miss number which is not in the cache before added to the cache.
import java.util.*;
class ListNode {
int key;
ListNode prev, next;
public ListNode(int key) {
this.key = key;
prev = next = null;
}
}
public class Solution {
public static int cacheMiss(int[] array, int size) {
if (array == null || array.length == 0 || size <= 0) {
return 0;
}
Map<Integer, ListNode> cache = new HashMap<>();
ListNode head = new ListNode(-1);
ListNode tail = new ListNode(-1);
head.next = tail;
tail.prev = head;
int count = 0;
for (int i = 0; i < array.length; i++) {
ListNode newNode = new ListNode(array[i]);
if (!cache.containsKey(array[i])) {
if (cache.size() == size) {
cache.remove(head.next.key);
head.next = head.next.next;
head.next.prev = head;
}
count++;
} else {
ListNode node = cache.get(array[i]);
node.prev.next = node.next;
node.next.prev = node.prev;
}
newNode.prev = tail.prev;
newNode.next = tail;
tail.prev = newNode;
newNode.prev.next = newNode;
cache.put(array[i], newNode);
}
return count;
}
public static void main(String[] args) {
int[] A = {1,2,3,1,4,3};
int res = cacheMiss(A, 3);
System.out.println(res);
}
}
No comments:
Post a Comment