[LeetCode] 146. LRU Cache

题: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)
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值