• 边工作边刷题:70天一遍leetcode: day 8-2


    LRU Cache

    这题调了好几天才pass
    要点:用doubly linked list,

    • deleteNode和addNode分开考虑,分开考虑,分开考虑,重要的事情说三遍
    • 需要dummy node和tail,deleteNode考虑tail,addNode考虑dummy.next(因为addNode alway加头)
    • set():最外分支是是否key已经在map里(在表示update),没在always加头

    错误点:

    • 空间满了以后先size--,这样空间未满的情况统一处理,注意别忘了size++
    • remove key from hmap顺序反了,固化:永远在改变结点之前。
    • 这题错误大多在deleteNode和addNode里,而且很难debug,比如,忘了连接dummy.next
    class LRUCache(object):
        class ListNode(object):
            def __init__(self, key, val):
                self.key = key
                self.val = val
                self.next = None
                self.prev = None
        
        def __init__(self, capacity):
            """
            :type capacity: int
            """
            self.capacity = capacity
            self.size = 0
            self.hmap = {}
            self.dummy = self.ListNode(0,0)
            self.tail = self.dummy
    
        def get(self, key):
            """
            :rtype: int
            """
            hmap=self.hmap
            if key not in hmap:
                return -1
                
            val = hmap[key].val
            self.deleteNode(hmap[key])
            self.addNode(hmap[key])
            return val
    
        def set(self, key, value):
            """
            :type key: int
            :type value: int
            :rtype: nothing
            """
            hmap=self.hmap
            if key not in hmap:
                print self.size,self.capacity
                if self.size==self.capacity:
                    print self.tail.key
                    hmap.pop(self.tail.key)
                    self.deleteNode(self.tail)
                    self.size-=1
                hmap[key]=self.ListNode(key,value)
                self.addNode(hmap[key])
                self.size+=1
            else:
                hmap[key].val=value
                self.deleteNode(hmap[key])
                self.addNode(hmap[key])
            
        def deleteNode(self, node):
            # print self.hmap, node.val, self.tail.val
            if self.tail==node:
                self.tail = self.tail.prev
                self.tail.next = None
            else:
                node.prev.next = node.next
                node.next.prev = node.prev
            
        def addNode(self, node):
            dummy = self.dummy
            if dummy.next:
                dummy.next.prev = node
            else:
                self.tail = node
            node.prev = dummy
            node.next = dummy.next
            dummy.next = node
    
    
  • 相关阅读:
    收藏网站代码
    将博客搬至CSDN
    AsyncTask源码浅析
    【转】Activity的launchMode分析 及 Intent.FLAG_NEW_TASK详解
    【转】Java异常:选择Checked Exception还是Unchecked Exception?
    springAOP基本概念和配置
    Java内部类的使用小结
    数据库索引浅析
    基于LinkedBlockingQueue源码自我实现阻塞队列
    【转】HTTP中Get与Post的区别——是我见过说得最全面的
  • 原文地址:https://www.cnblogs.com/absolute/p/5675758.html
Copyright © 2020-2023  润新知