This is quite comprehensive. We use double linked list.
Solution:
# T:O(1) S:O(n) class ListNode: def __init__(self, key, val): self.val = val self.key = key self.next = None self.prev = None class LinkedList: def __init__(self): self.head = None self.tail = None def insert(self, node): if self.head is None: self.head = node else: self.tail.next = node node.prev = self.tail self.tail = node def delete(self, node): if node.prev: node.prev.next = node.next else: self.head = node.next if node.next: node.next.prev = node.prev else: self.tail = node.prev del node class LRUCache: # @param capacity, an integer def __init__(self, capacity): self.list = LinkedList() self.dict = {} self.capacity = capacity def _insert(self, key, val): node = ListNode(key, val) self.list.insert(node) self.dict[key] = node # @return an integer def get(self, key): if key in self.dict: val = self.dict[key].val self.list.delete(self.dict[key]) self._insert(key, val) return val return -1 # @param key, an integer # @param value, an integer # @return nothing def set(self, key, val): if key in self.dict: self.list.delete(self.dict[key]) elif len(self.dict) == self.capacity: del self.dict[self.list.head.key] self.list.delete(self.list.head) self._insert(key, val) import collections class LRUCache2: def __init__(self, capacity): self.cache = collections.OrderedDict() self.capacity = capacity def get(self, key): if key not in self.cache: return -1 val = self.cache[key] del self.cache[key] self.cache[key] = val return val def set(self, key, value): if key in self.cache: del self.cache[key] elif len(self.cache) == self.capacity: self.cache.popitem(last=False) self.cache[key] = valueRun Time: 436 ms
No comments:
Post a Comment