题:https://leetcode.com/problems/lru-cache/description/
题目
Design and implement a data structure for Least Recently Used (LRU) cache. It should support the following operations: get and put.
get(key) - Get the value (will always be positive) of the key if the key exists in the cache, otherwise return -1.
put(key, value) - Set or insert the value if the key is not already present. When the cache reached its capacity, it should invalidate the least recently used item before inserting a new item.
Follow up:
Could you do both operations in O(1) time complexity?
Example:
LRUCache cache = new LRUCache( 2 /* capacity */ );
cache.put(1, 1);
cache.put(2, 2);
cache.get(1); // returns 1
cache.put(3, 3); // evicts key 2
cache.get(2); // returns -1 (not found)
cache.put(4, 4); // evicts key 1
cache.get(1); // returns -1 (not found)
cache.get(3); // returns 3
cache.get(4); // returns 4
思路
用 capacity 长度的向量来 记录LRU 的数值
用 两个字典
实现 从向量下标 到 key的映射 和 key到 value 与 向量下标的映射。
code
beats 93.49 % of python submissions
import numpy as np
class LRUCache(object):
def __init__(self, capacity):
"""
:type capacity: int
"""
self.countmat = np.zeros(capacity)
self.capacity = capacity
self.capacityDict = {}
self.count_capDict = {}
self.amount = 0
def get(self, key):
"""
:type key: int
:rtype: int
"""
res = -1
if key in self.capacityDict:
res = self.capacityDict[key][0]
self.countmat += 1
self.countmat[self.capacityDict[key][1]] = 0
return res
def put(self, key, value):
"""
:type key: int
:type value: int
:rtype: void
"""
if key in self.capacityDict:
self.capacityDict[key][0] = value
self.countmat += 1
self.countmat[self.capacityDict[key][1]] = 0
return
locmax = np.argmax(self.countmat)
if self.amount + 1 > self.capacity:
tmpkey = self.count_capDict[locmax]
del self.capacityDict[tmpkey]
self.amount -= 1
self.capacityDict[key] = [value, locmax]
self.count_capDict[locmax] = key
self.amount += 1
self.countmat += 1
self.countmat[self.capacityDict[key][1]] = 0
# Your LRUCache object will be instantiated and called as such:
# obj = LRUCache(capacity)
# param_1 = obj.get(key)
# obj.put(key,value)
beats 20.92 % of python submissions.
import numpy as np
class LRUCache(object):
def __init__(self, capacity):
"""
:type capacity: int
"""
self.countmat = np.zeros(capacity)
self.capacity = capacity
self.capacityList = {}
self.amount = 0
def get(self, key):
"""
:type key: int
:rtype: int
"""
res = -1
if key in self.capacityList:
res = self.capacityList[key][0]
self.countmat += 1
self.countmat[self.capacityList[key][1]] = 0
return res
def put(self, key, value):
"""
:type key: int
:type value: int
:rtype: void
"""
if key in self.capacityList:
self.capacityList[key][0] = value
self.countmat += 1
self.countmat[self.capacityList[key][1]] = 0
return
locmax = np.argmax(self.countmat)
if self.amount + 1 > self.capacity:
for ele in self.capacityList:
if self.capacityList[ele][1] == locmax:
del self.capacityList[ele]
break
self.amount -= 1
self.capacityList[key] = [value, locmax]
self.amount += 1
self.countmat += 1
self.countmat[self.capacityList[key][1]] = 0
# Your LRUCache object will be instantiated and called as such:
# obj = LRUCache(capacity)
# param_1 = obj.get(key)
# obj.put(key,value)
Time Limit Exceeded
class LRUCache(object):
def __init__(self, capacity):
"""
:type capacity: int
"""
self.capacity = capacity
self.capacityList = [(-1,-1)] * capacity
self.loc = -1
def get(self, key):
"""
:type key: int
:rtype: int
"""
tmp = (-1,-1)
isexist = False
for i in range(self.capacity-1,-1,-1):
if not isexist:
if self.capacityList[i][0] == key:
isexist =True
tmp = self.capacityList[i]
else:
self.capacityList[i+1] = self.capacityList[i]
if isexist:
self.capacityList[0] = tmp
return tmp[1]
def put(self, key, value):
"""
:type key: int
:type value: int
:rtype: void
"""
if self.get(key)!=-1:
self.capacityList[0] = (key,value)
return
if self.loc + 1 < self.capacity:
self.loc += 1
for i in range(self.capacity-2,-1,-1):
self.capacityList[i+1] = self.capacityList[i]
self.capacityList[0] = (key,value)
# Your LRUCache object will be instantiated and called as such:
# obj = LRUCache(capacity)
# param_1 = obj.get(key)
# obj.put(key,value)