【LeetCode with Python】 LRU Cache

博客域名: http://www.xnerv.wang
原题页面: https://oj.leetcode.com/problems/lru-cache/
题目类型:数据结构
难度评价:★★
文本地址: http://blog.csdn.net/nerv3x3/article/details/2920168

Design and implement a data structure for Least Recently Used (LRU) cache. It should support the following operations:get and set.

get(key) - Get the value (will always be positive) of the key if the key exists in the cache, otherwise return -1.
set(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.


实现一个LRU缓存。最近最少使用LRU表的定义就不多说了,需要实现的get方法是根据key取value的,因此显然需要一个map,在Python里叫关联数组的帮助。虽然在leetcode中这道题被标为Hard级别,但其实这只是一道工程性质的题目。


class LRUCache:

    class LRUNode:
        def __init__(self, key, value):
            self.prev = None
            self.next = None
            self.key = key
            self.value = value

    # @param capacity, an integer
    def __init__(self, capacity):
        self.map = { }
        self.list_head = LRUCache.LRUNode(-1, -1)
        self.list_tail = LRUCache.LRUNode(-1, -1)
        self.list_head.next = self.list_tail
        self.list_tail.prev = self.list_head
        self.capacity = capacity

    def remove_node(self, node):
        node.prev.next = node.next
        node.next.prev = node.prev
    
    def append_node(self, new_node):
        last_node = self.list_tail.prev
        last_node.next = new_node
        new_node.prev = last_node
        new_node.next = self.list_tail
        self.list_tail.prev = new_node

    # @return an integer
    def get(self, key):
        if self.map.has_key(key):
            cur = self.map.get(key)
            self.remove_node(cur)
            self.append_node(cur)
            return cur.value
        else:
            return -1

    # @param key, an integer
    # @param value, an integer
    # @return nothing
    def set(self, key, value):
        if self.map.has_key(key):
            old_node = self.map.get(key)
            self.remove_node(old_node)
            old_node.value = value
            self.append_node(old_node)
        else:
            if len(self.map) >= self.capacity:
                del_node = self.list_head.next
                self.remove_node(del_node)
                del self.map[del_node.key]
            new_node = LRUCache.LRUNode(key, value)
            self.append_node(new_node)
            self.map[key] = new_node

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值